vanilla-wow-addons – Rev 1
?pathlinks?
--------------------------------------------------------------------------
-- ChatBar.lua
--------------------------------------------------------------------------
--[[
ChatBar
Author: AnduinLothar KarlKFI@cosmosui.org
Graphics: Vynn
-Button Bar for openning chat messages of each type.
Change Log:
v1.0
-Initial Release
v1.1
-Addon Channels Hidden added GuildMap
-Text has been made Localizable
-Officer chat shows up if you CanEditOfficerNote()
-Buttons now correctly update when raid, party, and guild changes
-Hide Text now correctly says Show Text
-Fixed button for channel 8 to diplay and tooltip correctly
-Added Reset Position Option
-Added Options to hide the each button by chat type or channel name (hide from button menu, show from main sub menu)
-Added option to use Channel Numbers as text overlay
-Added VisibilityOptions, however autohide is a bit finicky atm.
v1.2
-VisibilityOptions AutoHide is now smarter and shows whenever ChatBar is sliding or being dragged or the cursor is over its menu
-Fixed Eclipse onload error
-Fixed Whisper abreviation
v1.3
-Fixed nil SetText errors
-Fixed channel 10 nil errors
-Added Channel Reorder (from ChannelManager) if you have Sky installed (uses many library functions)
v1.4
-Fixed a nil loading error
v1.5
-Fixed saved variables issue with 1.11 not saving nils
-Fixed a nill bug with the right-click menu
v1.6
-Channel Reorder no longer requires Sky
-toc to 11200
]]--
--------------------------------------------------
-- Globals
--------------------------------------------------
CHAT_BAR_MAX_BUTTONS = 20;
CHAT_BAR_UPDATE_DELAY = 30;
ChatBar_VerticalDisplay = false;
ChatBar_AlternateOrientation = false;
ChatBar_TextOnButtonDisplay = false;
ChatBar_ButtonFlashing = true;
ChatBar_BarBorder = true;
ChatBar_ButtonText = true;
ChatBar_TextChannelNumbers = false;
ChatBar_VerticalDisplay_Sliding = false;
ChatBar_AlternateDisplay_Sliding = false;
ChatBar_HideSpecialChannels = true;
ChatBar_LastTell = nil;
ChatBar_StoredStickies = { };
ChatBar_HiddenButtons = { };
--------------------------------------------------
-- Retell Hook
--------------------------------------------------
local SendChatMessage_orig = SendChatMessage;
function ChatBar_SendChatMessage(text, type, language, target)
SendChatMessage_orig(text, type, language, target);
-- saves target for 'Retell'
if ( type == "WHISPER" ) then
ChatBar_LastTell = target;
end
end
SendChatMessage = ChatBar_SendChatMessage;
--------------------------------------------------
-- Button Functions
--------------------------------------------------
function ChatBar_StandardButtonClick(button)
local chatFrame = SELECTED_DOCK_FRAME
if ( not chatFrame ) then
chatFrame = DEFAULT_CHAT_FRAME;
end
if (button == "RightButton") then
ToggleDropDownMenu(1, this.ChatID, ChatBar_DropDown, this:GetName(), 10, 0, "TOPRIGHT");
else
local chatType = ChatBar_ChatTypes[this.ChatID].type;
chatFrame.editBox:Show();
if (chatFrame.editBox.chatType == chatType) then
ChatFrame_OpenChat("", chatFrame);
else
chatFrame.editBox.chatType = chatType;
end
ChatEdit_UpdateHeader(chatFrame.editBox);
end
end
function ChatBar_WhisperButtonClick(button)
local chatFrame = SELECTED_DOCK_FRAME
if ( not chatFrame ) then
chatFrame = DEFAULT_CHAT_FRAME;
end
if (button == "RightButton") then
ToggleDropDownMenu(1, this.ChatID, ChatBar_DropDown, this:GetName(), 10, 0, "TOPRIGHT");
else
local chatType = ChatBar_ChatTypes[this.ChatID].type;
--ChatFrame_SendTell(name, SELECTED_DOCK_FRAME)
if (chatFrame.editBox.chatType == chatType) then
ChatFrame_OpenChat("", chatFrame);
else
ChatFrame_ReplyTell(chatFrame);
if (not chatFrame.editBox:IsVisible()) or (chatFrame.editBox.chatType ~= chatType) then
ChatFrame_OpenChat("/w ", chatFrame);
end
end
end
end
function ChatBar_ChannelShortText(index)
local channelNum, channelName = GetChannelName(index);
if (channelNum ~= 0) then
if (ChatBar_TextChannelNumbers) then
return channelNum;
else
return strsub(channelName,1,1);
end
end
end
function ChatBar_ChannelText(index)
local channelNum, channelName = GetChannelName(index);
if (channelNum ~= 0) then
return channelNum..") "..channelName;
end
return "";
end
function ChatBar_ChannelClick(button, index)
if (not index) then
index = 1;
end
local chatFrame = SELECTED_DOCK_FRAME
if ( not chatFrame ) then
chatFrame = DEFAULT_CHAT_FRAME;
end
if (button == "RightButton") then
ToggleDropDownMenu(1, this.ChatID, ChatBar_DropDown, this:GetName(), 10, 0, "TOPRIGHT");
else
--local chatType = ChatBar_ChatTypes[this.ChatID].type;
chatFrame.editBox:Show();
if (chatFrame.editBox.chatType == "CHANNEL") and (chatFrame.editBox.channelTarget == index) then
ChatFrame_OpenChat("", chatFrame);
else
chatFrame.editBox.chatType = "CHANNEL";
chatFrame.editBox.channelTarget = index
ChatEdit_UpdateHeader(chatFrame.editBox);
end
end
end
function ChatBar_ChannelShow(index)
local channelNum, channelName = GetChannelName(index);
if (channelNum ~= 0) then
if (ChatBar_HideSpecialChannels) then
--Special Hidden Whisper Ignores
if ( IsAddOnLoaded("Sky") ) then
if (string.len(channelName) >= 3) and (string.sub(channelName,1,3) == "Sky") then
--Hide Sky channels
return;
end
for i, bogusName in BOGUS_CHANNELS do
if (channelName == bogusName) then
--Hide reorder channels
return;
end
end
elseif ( IsAddOnLoaded("CallToArms") ) and (channelName == CTA_DEFAULT_RAID_CHANNEL) then
--Hide CallToArms channel
return;
elseif ( IsAddOnLoaded("CT_RaidAssist") ) and (channelName == CT_RA_Channel) then
--Hide CT_RaidAssist channel
return;
elseif ( IsAddOnLoaded("GuildMap") ) and (GuildMapConfig) and (channelName == GuildMapConfig.channel) then
--Hide GuildMap channel
return;
elseif ( channelName == "GlobalComm" ) then
--Hide standard GlobalComm channel (Telepathy, AceComm)
return;
end
end
return (not ChatBar_HiddenButtons[ChatBar_GetFirstWord(channelName)]);
end
end
--------------------------------------------------
-- Button Info
--------------------------------------------------
ChatBar_ChatTypes = {
{
type = "SAY",
shortText = function() return CHATBAR_SAY_ABRV; end,
text = function() return CHAT_MSG_SAY; end,
click = ChatBar_StandardButtonClick,
show = function()
return (not ChatBar_HiddenButtons[CHAT_MSG_SAY]);
end
},
{
type = "YELL",
shortText = function() return CHATBAR_YELL_ABRV; end,
text = function() return CHAT_MSG_YELL; end,
click = ChatBar_StandardButtonClick,
show = function()
return (not ChatBar_HiddenButtons[CHAT_MSG_YELL]);
end
},
{
type = "PARTY",
shortText = function() return CHATBAR_PARTY_ABRV; end,
text = function() return CHAT_MSG_PARTY; end,
click = ChatBar_StandardButtonClick,
show = function()
return UnitExists("party1") and (not ChatBar_HiddenButtons[CHAT_MSG_PARTY]);
end
},
{
type = "RAID",
shortText = function() return CHATBAR_RAID_ABRV; end,
text = function() return CHAT_MSG_RAID; end,
click = ChatBar_StandardButtonClick,
show = function()
return (GetNumRaidMembers() > 0) and (not ChatBar_HiddenButtons[CHAT_MSG_RAID]);
end
},
{
type = "GUILD",
shortText = function() return CHATBAR_GUILD_ABRV; end,
text = function() return CHAT_MSG_GUILD; end,
click = ChatBar_StandardButtonClick,
show = function()
return IsInGuild() and (not ChatBar_HiddenButtons[CHAT_MSG_GUILD]);
end
},
{
type = "OFFICER",
shortText = function() return CHATBAR_OFFICER_ABRV; end,
text = function() return CHAT_MSG_OFFICER; end,
click = ChatBar_StandardButtonClick,
show = function()
return CanEditOfficerNote() and (not ChatBar_HiddenButtons[CHAT_MSG_OFFICER]);
end
},
{
type = "WHISPER",
shortText = function() return CHATBAR_WHISPER_ABRV; end,
text = function() return CHAT_MSG_WHISPER_INFORM; end,
click = ChatBar_WhisperButtonClick,
show = function()
return (not ChatBar_HiddenButtons[CHAT_MSG_WHISPER_INFORM]);
end
},
{
type = "EMOTE",
shortText = function() return CHATBAR_EMOTE_ABRV; end,
text = function() return CHAT_MSG_EMOTE; end,
click = ChatBar_StandardButtonClick,
show = function()
return (not ChatBar_HiddenButtons[CHAT_MSG_EMOTE]);
end
},
{
type = "CHANNEL1",
shortText = function() return ChatBar_ChannelShortText(1); end,
text = function() return ChatBar_ChannelText(1); end,
click = function(button) ChatBar_ChannelClick(button, 1); end,
show = function() return ChatBar_ChannelShow(1); end
},
{
type = "CHANNEL2",
shortText = function() return ChatBar_ChannelShortText(2); end,
text = function() return ChatBar_ChannelText(2); end,
click = function(button) ChatBar_ChannelClick(button, 2); end,
show = function() return ChatBar_ChannelShow(2); end
},
{
type = "CHANNEL3",
shortText = function() return ChatBar_ChannelShortText(3); end,
text = function() return ChatBar_ChannelText(3); end,
click = function(button) ChatBar_ChannelClick(button, 3); end,
show = function() return ChatBar_ChannelShow(3); end
},
{
type = "CHANNEL4",
shortText = function() return ChatBar_ChannelShortText(4); end,
text = function() return ChatBar_ChannelText(4); end,
click = function(button) ChatBar_ChannelClick(button, 4); end,
show = function() return ChatBar_ChannelShow(4); end
},
{
type = "CHANNEL5",
shortText = function() return ChatBar_ChannelShortText(5); end,
text = function() return ChatBar_ChannelText(5); end,
click = function(button) ChatBar_ChannelClick(button, 5); end,
show = function() return ChatBar_ChannelShow(5); end
},
{
type = "CHANNEL6",
shortText = function() return ChatBar_ChannelShortText(6); end,
text = function() return ChatBar_ChannelText(6); end,
click = function(button) ChatBar_ChannelClick(button, 6); end,
show = function() return ChatBar_ChannelShow(6); end
},
{
type = "CHANNEL7",
shortText = function() return ChatBar_ChannelShortText(7); end,
text = function() return ChatBar_ChannelText(7); end,
click = function(button) ChatBar_ChannelClick(button, 7); end,
show = function() return ChatBar_ChannelShow(7); end
},
{
type = "CHANNEL8",
shortText = function() return ChatBar_ChannelShortText(8); end,
text = function() return ChatBar_ChannelText(8); end,
click = function(button) ChatBar_ChannelClick(button, 8); end,
show = function() return ChatBar_ChannelShow(8); end
},
{
type = "CHANNEL9",
shortText = function() return ChatBar_ChannelShortText(9); end,
text = function() return ChatBar_ChannelText(9); end,
click = function(button) ChatBar_ChannelClick(button, 9); end,
show = function() return ChatBar_ChannelShow(9); end
},
{
type = "CHANNEL10",
shortText = function() return ChatBar_ChannelShortText(10); end,
text = function() return ChatBar_ChannelText(10); end,
click = function(button) ChatBar_ChannelClick(button, 10); end,
show = function() return ChatBar_ChannelShow(10); end
}
};
ChatBar_BarTypes = {};
--------------------------------------------------
-- Frame Scripts
--------------------------------------------------
function ChatBar_OnLoad()
this:RegisterEvent("UPDATE_CHAT_COLOR");
this:RegisterEvent("CHAT_MSG_CHANNEL_NOTICE");
this:RegisterEvent("PARTY_MEMBERS_CHANGED");
this:RegisterEvent("RAID_ROSTER_UPDATE");
this:RegisterEvent("PLAYER_GUILD_UPDATE");
this:RegisterEvent("VARIABLES_LOADED");
this:RegisterForDrag("LeftButton");
this.velocity = 0;
if (Eclipse) then
--Register with VisibilityOptions
Eclipse.registerForVisibility( {
name = "ChatBarFrame"; --The name of the config, in this case also the name of the frame
uiname = "ChatBar"; --This is the base name of this reg to display in the description and ui
slashcom = { "chatbar", "cb" }; --These are the slash commands
reqs = { var=ChatBar_ShowIf, val=true, show=true };
} );
end
end
function ChatBar_ShowIf()
return ChatBarFrame.isSliding or ChatBarFrame.isMoving or (type(ChatBarFrame.count)=="number") or ((UIDROPDOWNMENU_OPEN_MENU=="ChatBar_DropDown" and (MouseIsOver(DropDownList1) or (UIDROPDOWNMENU_MENU_LEVEL==2 and MouseIsOver(DropDownList2))))==1);
end
function ChatBar_OnEvent(event)
if ( event == "UPDATE_CHAT_COLOR" ) then
ChatBarFrame.count = 0;
elseif ( event == "CHAT_MSG_CHANNEL_NOTICE" ) then
ChatBarFrame.count = 0;
elseif ( event == "PARTY_MEMBERS_CHANGED" ) then
ChatBarFrame.count = 0;
elseif ( event == "RAID_ROSTER_UPDATE" ) then
ChatBarFrame.count = 0;
elseif ( event == "PLAYER_GUILD_UPDATE" ) then
ChatBarFrame.count = 0;
elseif ( event == "CHAT_MSG_CHANNEL" ) and (type(arg8) == "number") then
if (ChatBar_BarTypes["CHANNEL"..arg8]) then
UIFrameFlash(getglobal("ChatBarFrameButton"..ChatBar_BarTypes["CHANNEL"..arg8].."Flash"), .5, .5, 1.1);
end
elseif (event == "CHAT_MSG_SAY") or (event == "CHAT_MSG_YELL") or (event == "CHAT_MSG_PARTY") or (event == "CHAT_MSG_RAID") or
(event == "CHAT_MSG_GUILD") or (event == "CHAT_MSG_OFFICER") or (event == "CHAT_MSG_WHISPER") or (event == "CHAT_MSG_EMOTE") then
--Sea.io.printComma(arg1,arg2,arg3);
if (ChatBar_BarTypes[strsub(event,10)]) then
UIFrameFlash(getglobal("ChatBarFrameButton"..ChatBar_BarTypes[strsub(event,10)].."Flash"), .5, .5, 1.1);
end
elseif ( event == "VARIABLES_LOADED" ) then
ChatBar_UpdateButtonOrientation();
ChatBar_UpdateButtonFlashing();
ChatBar_UpdateBarBorder();
ChatBar_UpdateButtonText();
--Update live Stickies
for chatType, enabled in ChatBar_StoredStickies do
if (enabled) then
ChatTypeInfo[chatType].sticky = enabled;
end
end
end
end
--ConstantInitialVelocity = 10;
ConstantVelocityModifier = 1.25;
ConstantJerk = 3*ConstantVelocityModifier;
ConstantSnapLimit = 2;
function ChatBar_OnUpdate(elapsed)
if (this.slidingEnabled) and (this.isSliding) and (this.velocity) and (this.endsize) then
local currSize = ChatBar_GetSize();
if (math.abs(currSize - this.endsize) < ConstantSnapLimit) then
ChatBar_SetSize(this.endsize);
ChatBarFrame.isSliding = nil;
this.velocity = 0;
if (ChatBar_VerticalDisplay_Sliding or ChatBar_AlternateDisplay_Sliding) and (this:GetWidth() <= 17) and (this:GetHeight() <= 17) then
if (ChatBar_VerticalDisplay_Sliding) then
ChatBar_VerticalDisplay_Sliding = nil;
ChatBar_Toggle_VerticalButtonOrientation();
elseif (ChatBar_AlternateDisplay_Sliding) then
ChatBar_AlternateDisplay_Sliding = nil;
ChatBar_Toggle_AlternateButtonOrientation();
end
ChatBar_UpdateOrientationPoint();
else
ChatBar_UpdateOrientationPoint(true);
end
else
--[[
local desiredVelocity = ConstantVelocityModifier * (this.endsize - currSize);
this.velocity = (1 - ConstantJerk) * this.velocity + ConstantJerk * desiredVelocity;
ChatBar_SetSize(currSize + this.velocity * elapsed);
]]--
--[[
local w = 1 - math.exp(-ConstantJerk* elapsed);
this.velocity = (1-w)*this.velocity + w*ConstantVelocityModifier*(this.endsize - currSize);
ChatBar_SetSize(currSize + this.velocity * elapsed);
]]--
--[[ incomplete
local totalDistance = this.endsize - this.startsize;
local distanceFromStart = this.startsize - currSize;
local accel = math.cos(distanceFromStart/totalDistance*math.pi) * ConstantJerk;
ChatBar_SetSize(currSize + accel * elapsed * elapsed);
]]--
local desiredVelocity = ConstantVelocityModifier * (this.endsize - currSize);
local acceleration = ConstantJerk * (desiredVelocity - this.velocity);
this.velocity = this.velocity + acceleration * elapsed;
ChatBar_SetSize(currSize + this.velocity * elapsed);
end
local frame, init, final, step;
for i=1, CHAT_BAR_MAX_BUTTONS do
frame = getglobal("ChatBarFrameButton".. i);
if (currSize >= i*16+18) then
frame:Show();
else
frame:Hide();
end
end
elseif (this.count) then
if (this.count > CHAT_BAR_UPDATE_DELAY) then
this.count = nil;
ChatBarFrame.slidingEnabled = true;
ChatBar_UpdateButtons();
else
this.count = this.count+1;
end
end
end
function ChatBar_GetSize()
if (ChatBar_VerticalDisplay) then
return ChatBarFrame:GetHeight();
else
return ChatBarFrame:GetWidth();
end
end
function ChatBar_SetSize(size)
if (ChatBar_VerticalDisplay) then
ChatBarFrame:SetHeight(size);
else
ChatBarFrame:SetWidth(size);
end
end
function ChatBar_Button_OnLoad()
this.Text = getglobal("ChatBarFrameButton"..this:GetID().."Text");
this.ChatID = this:GetID();
getglobal(this:GetName().."Highlight"):SetAlpha(.75);
getglobal(this:GetName().."UpTex_Spec"):SetAlpha(.75);
getglobal(this:GetName().."UpTex_Shad"):SetAlpha(.75);
--getglobal(this:GetName().."DownTex_Spec"):SetAlpha(1);
getglobal(this:GetName().."DownTex_Shad"):SetAlpha(1);
this:SetFrameLevel(this:GetFrameLevel()+1);
this:RegisterForClicks("LeftButtonDown", "RightButtonDown");
end
function ChatBar_Button_OnClick()
ChatBar_ChatTypes[this.ChatID].click(arg1);
end
function ChatBar_Button_OnEnter()
--local id = this:GetID();
if (this.ChatID) then
ChatBarFrameTooltip:SetOwner(this, "ANCHOR_TOPLEFT");
ChatBarFrameTooltip:SetText(ChatBar_ChatTypes[this.ChatID].text());
end
end
function ChatBar_Button_OnLeave()
if (ChatBarFrameTooltip:IsOwned(this)) then
ChatBarFrameTooltip:Hide();
end
end
function ChatBar_OnMouseDown(button)
if (button == "RightButton") then
ToggleDropDownMenu(1, "ChatBarMenu", ChatBar_DropDown, "cursor");
else
local x, y = GetCursorPosition();
this.xOffset = x - this:GetLeft();
this.yOffset = y - this:GetBottom();
end
end
function ChatBar_OnDragStart()
if (not this.isSliding) then
local x, y = GetCursorPosition();
this:ClearAllPoints();
this:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", x-this.xOffset, y-this.yOffset);
this:StartMoving();
this.isMoving = true;
end
end
function ChatBar_OnDragStop()
this:StopMovingOrSizing();
this.isMoving = false;
ChatBar_UpdateOrientationPoint(true);
end
--------------------------------------------------
-- DropDown Menu
--------------------------------------------------
function ChatBar_DropDownOnLoad()
UIDropDownMenu_Initialize(this, ChatBar_LoadDropDownMenu, "MENU");
end
function ChatBar_LoadDropDownMenu()
if (not UIDROPDOWNMENU_MENU_VALUE) then
return;
end
if (UIDROPDOWNMENU_MENU_VALUE == "ChatBarMenu") then
ChatBar_CreateFrameMenu();
elseif (UIDROPDOWNMENU_MENU_VALUE == "HiddenButtonsMenu") then
ChatBar_CreateHiddenButtonsMenu();
else
ChatBar_CreateButtonMenu();
end
end
function ChatBar_CreateFrameMenu()
--Title
local info = {};
info.text = CHATBAR_MENU_MAIN_TITLE;
info.notClickable = 1;
info.isTitle = 1;
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Vertical
local info = {};
info.text = CHATBAR_MENU_MAIN_VERTICAL;
info.func = ChatBar_Toggle_VerticalButtonOrientationSlide;
if (ChatBar_VerticalDisplay) then
info.checked = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Alt Button
local info = {};
info.text = CHATBAR_MENU_MAIN_REVERSE;
info.func = ChatBar_Toggle_AlternateButtonOrientationSlide;
if (ChatBar_AlternateOrientation) then
info.checked = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Text On Buttons
local info = {};
info.text = CHATBAR_MENU_MAIN_TEXTONBUTTONS;
info.func = ChatBar_Toggle_TextOrientation;
info.keepShownOnClick = 1;
if (ChatBar_TextOnButtonDisplay) then
info.checked = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Show Button Text
local info = {};
info.text = CHATBAR_MENU_MAIN_SHOWTEXT;
info.func = ChatBar_Toggle_ButtonText;
info.keepShownOnClick = 1;
if (ChatBar_ButtonText) then
info.checked = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Use Channel ID on Buttons
local info = {};
info.text = CHATBAR_MENU_MAIN_CHANNELID;
info.func = ChatBar_Toggle_TextChannelNumbers;
info.keepShownOnClick = 1;
if (ChatBar_TextChannelNumbers) then
info.checked = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Button Flashing
local info = {};
info.text = CHATBAR_MENU_MAIN_BUTTONFLASHING;
info.func = ChatBar_Toggle_ButtonFlashing;
info.keepShownOnClick = 1;
if (ChatBar_ButtonFlashing) then
info.checked = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Bar Border
local info = {};
info.text = CHATBAR_MENU_MAIN_BARBORDER;
info.func = ChatBar_Toggle_BarBorder;
info.keepShownOnClick = 1;
if (ChatBar_BarBorder) then
info.checked = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Hide Special
local info = {};
info.text = CHATBAR_MENU_MAIN_ADDONCHANNELS;
info.func = ChatBar_Toggle_HideSpecialChannels;
if (ChatBar_HideSpecialChannels) then
info.checked = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
if (ChatBar_GetTableSize(ChatBar_HiddenButtons) > 0) then
--Show Hidden Buttons
local info = {};
info.text = CHATBAR_MENU_MAIN_HIDDENBUTTONS;
info.hasArrow = 1;
info.func = nil;
info.value = "HiddenButtonsMenu";
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
end
--Reset Position
local info = {};
info.text = CHATBAR_MENU_MAIN_RESET;
info.func = ChatBar_Reset;
if (not ChatBarFrame:IsUserPlaced()) then
info.checked = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
if (ChatBar_ReorderChannels) then
--Reorder Channels
local info = {};
info.text = CHATBAR_MENU_MAIN_REORDER;
info.func = ChatBar_ReorderChannels;
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
end
end
function ChatBar_CreateHiddenButtonsMenu()
for k,v in ChatBar_HiddenButtons do
--Show Button
local info = {};
info.text = format(CHATBAR_MENU_SHOW_BUTTON, k);
local ctype = k;
info.func = function() ChatBar_HiddenButtons[ctype]=nil ChatBarFrame.count = 0; end;
info.notCheckable = 1;
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
end
end
function ChatBar_CreateButtonMenu()
local buttonHeader = ChatBar_ChatTypes[UIDROPDOWNMENU_MENU_VALUE].type;
--Title
local info = {};
info.text = ChatBar_ChatTypes[UIDROPDOWNMENU_MENU_VALUE].text();
info.notClickable = 1;
info.isTitle = 1;
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
local chatType, channelIndex = string.gfind(buttonHeader, "([^%d]*)([%d]+)$")();
if (channelIndex) then
local channelNum, channelName = GetChannelName(tonumber(channelIndex));
--Leave
local info = {};
info.text = CHATBAR_MENU_CHANNEL_LEAVE;
info.func = function() LeaveChannelByName(channelNum) end;
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Channel User List
local info = {};
info.text = CHATBAR_MENU_CHANNEL_LIST;
info.func = function() ListChannelByName(channelNum) end;
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Hide Button
local channelShortName = ChatBar_GetFirstWord(channelName);
local info = {};
info.text = format(CHATBAR_MENU_HIDE_BUTTON, channelShortName);
info.func = function() ChatBar_HiddenButtons[channelShortName]=true; ChatBarFrame.count = 0; end;
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
else
--Hide Button
local info = {};
local localizedChatType = ChatBar_ChatTypes[UIDROPDOWNMENU_MENU_VALUE].text()
info.text = format(CHATBAR_MENU_HIDE_BUTTON, localizedChatType);
info.func = function() ChatBar_HiddenButtons[localizedChatType]=true; ChatBarFrame.count = 0; end;
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
end
if (buttonHeader == "WHISPER") then
local chatFrame = SELECTED_DOCK_FRAME
if ( not chatFrame ) then
chatFrame = DEFAULT_CHAT_FRAME;
end
--Reply
local info = {};
info.text = CHATBAR_MENU_WHISPER_REPLY;
info.func = function()
ChatFrame_ReplyTell(chatFrame)
end;
if (ChatEdit_GetLastTellTarget(ChatFrameEditBox) == "") then
info.disabled = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
--Retell
local info = {};
info.text = CHATBAR_MENU_WHISPER_RETELL;
info.func = function()
ChatFrame_SendTell(ChatBar_LastTell, chatFrame)
end;
if (not ChatBar_LastTell) then
info.disabled = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
end
--Sticky
local info = {};
if (chatType) then
info.text = CHATBAR_MENU_CHANNEL_STICKY;
else
info.text = CHATBAR_MENU_STICKY;
chatType = buttonHeader;
end
info.func = function()
if (ChatTypeInfo[chatType].sticky == 1) then
ChatTypeInfo[chatType].sticky = 0;
ChatBar_StoredStickies[chatType] = 0;
else
ChatTypeInfo[chatType].sticky = 1;
ChatBar_StoredStickies[chatType] = 1;
end
end;
if (ChatTypeInfo[chatType].sticky == 1) then
info.checked = 1;
end
if (not ChatTypeInfo[chatType]) then
info.disabled = 1;
end
UIDropDownMenu_AddButton(info, UIDROPDOWNMENU_MENU_LEVEL);
end
--------------------------------------------------
-- Update Functions
--------------------------------------------------
function ChatBar_UpdateButtons()
ChatBar_BarTypes = {};
local i = 1;
local buttonIndex = 1;
while (ChatBar_ChatTypes[i]) and (buttonIndex <= CHAT_BAR_MAX_BUTTONS) do
if (ChatBar_ChatTypes[i].show()) then
local info=ChatTypeInfo[ChatBar_ChatTypes[i].type];
ChatBar_BarTypes[ChatBar_ChatTypes[i].type] = buttonIndex;
getglobal("ChatBarFrameButton".. buttonIndex.."Highlight"):SetVertexColor(info.r, info.g, info.b);
getglobal("ChatBarFrameButton".. buttonIndex.."Flash"):SetVertexColor(info.r, info.g, info.b);
getglobal("ChatBarFrameButton".. buttonIndex.."Center"):SetVertexColor(info.r, info.g, info.b);
getglobal("ChatBarFrameButton".. buttonIndex.."Text"):SetText(ChatBar_ChatTypes[i].shortText());
getglobal("ChatBarFrameButton".. buttonIndex).ChatID = i;
--getglobal("ChatBarFrameButton".. buttonIndex):Show();
buttonIndex = buttonIndex+1;
end
i = i+1;
end
local size = (buttonIndex-1)*16+20;
if (ChatBar_VerticalDisplay) then
ChatBarFrame:SetWidth(16);
if (ChatBarFrame:GetTop()) then
ChatBar_StartSlidingTo(size);
else
ChatBarFrame:SetHeight(size);
end
else
ChatBarFrame:SetHeight(16);
if (ChatBarFrame:GetRight()) then
ChatBar_StartSlidingTo(size);
else
ChatBarFrame:SetWidth(size);
end
--/z ChatBarFrame.startpoint = ChatBarFrame:GetRight();ChatBarFrame.endsize = ChatBarFrame:GetLeft() + 260;
--/z ChatBarFrame.centerpoint = ChatBarFrame.startpoint + (ChatBarFrame.endsize - ChatBarFrame.startpoint)/2;ChatBarFrame.velocity = 0;ChatBarFrame.isSliding = true;
--/z ChatBarFrame.isSliding = nil; ChatBarFrame:SetWidth(180)
--/z ChatBar_StartSlidingTo(300)
end
while (buttonIndex <= CHAT_BAR_MAX_BUTTONS) do
--getglobal("ChatBarFrameButton".. buttonIndex):Hide();
getglobal("ChatBarFrameButton".. buttonIndex).ChatID = nil;
buttonIndex = buttonIndex+1;
end
end
function ChatBar_StartSlidingTo(size)
ChatBarFrame.endsize = size;
ChatBarFrame.isSliding = true;
end
function ChatBar_PrintSlideInfo()
Sea.io.printComma(ChatBarFrame.isSliding, ChatBarFrame.endsize, ChatBarFrame.velocity);
end
function ChatBar_UpdateButtonOrientation()
local button = ChatBarFrameButton1;
button:ClearAllPoints();
button.Text:ClearAllPoints();
if (ChatBar_VerticalDisplay) then
if (ChatBar_AlternateOrientation) then
button:SetPoint("TOP", "ChatBarFrame", "TOP", 0, -10);
else
button:SetPoint("BOTTOM", "ChatBarFrame", "BOTTOM", 0, 10);
end
if (ChatBar_TextOnButtonDisplay) then
button.Text:SetPoint("CENTER", button);
else
button.Text:SetPoint("RIGHT", button, "LEFT", 0, 0);
end
else
if (ChatBar_AlternateOrientation) then
button:SetPoint("RIGHT", "ChatBarFrame", "RIGHT", -10, 0);
else
button:SetPoint("LEFT", "ChatBarFrame", "LEFT", 10, 0);
end
if (ChatBar_TextOnButtonDisplay) then
button.Text:SetPoint("CENTER", button);
else
button.Text:SetPoint("BOTTOM", button, "TOP");
end
end
for i=2, CHAT_BAR_MAX_BUTTONS do
button = getglobal("ChatBarFrameButton"..i);
button:ClearAllPoints();
button.Text:ClearAllPoints();
if (ChatBar_VerticalDisplay) then
if (ChatBar_AlternateOrientation) then
button:SetPoint("TOP", "ChatBarFrameButton"..(i-1), "BOTTOM");
else
button:SetPoint("BOTTOM", "ChatBarFrameButton"..(i-1), "TOP");
end
if (ChatBar_TextOnButtonDisplay) then
button.Text:SetPoint("CENTER", button);
else
button.Text:SetPoint("RIGHT", button, "LEFT");
end
else
if (ChatBar_AlternateOrientation) then
button:SetPoint("RIGHT", "ChatBarFrameButton"..(i-1), "LEFT");
else
button:SetPoint("LEFT", "ChatBarFrameButton"..(i-1), "RIGHT");
end
if (ChatBar_TextOnButtonDisplay) then
button.Text:SetPoint("CENTER", button);
else
button.Text:SetPoint("BOTTOM", button, "TOP");
end
end
end
end
function ChatBar_UpdateButtonFlashing()
local frame = ChatBarFrame;
if (ChatBar_ButtonFlashing) then
frame:RegisterEvent("CHAT_MSG_SAY");
frame:RegisterEvent("CHAT_MSG_YELL");
frame:RegisterEvent("CHAT_MSG_PARTY");
frame:RegisterEvent("CHAT_MSG_RAID");
frame:RegisterEvent("CHAT_MSG_GUILD");
frame:RegisterEvent("CHAT_MSG_OFFICER");
frame:RegisterEvent("CHAT_MSG_WHISPER");
frame:RegisterEvent("CHAT_MSG_EMOTE");
frame:RegisterEvent("CHAT_MSG_CHANNEL");
else
frame:UnregisterEvent("CHAT_MSG_SAY");
frame:UnregisterEvent("CHAT_MSG_YELL");
frame:UnregisterEvent("CHAT_MSG_PARTY");
frame:UnregisterEvent("CHAT_MSG_RAID");
frame:UnregisterEvent("CHAT_MSG_GUILD");
frame:UnregisterEvent("CHAT_MSG_OFFICER");
frame:UnregisterEvent("CHAT_MSG_WHISPER");
frame:UnregisterEvent("CHAT_MSG_EMOTE");
frame:UnregisterEvent("CHAT_MSG_CHANNEL");
end
end
function ChatBar_UpdateBarBorder()
if (ChatBar_BarBorder) then
ChatBarFrameBackground:Show();
else
ChatBarFrameBackground:Hide();
end
end
function ChatBar_Reset()
ChatBarFrame:ClearAllPoints();
ChatBarFrame:SetPoint("BOTTOMLEFT", "ChatFrame1", "TOPLEFT", 0, 30);
ChatBarFrame:SetUserPlaced(0);
end
--------------------------------------------------
-- Configuration Functions
--------------------------------------------------
function ChatBar_Toggle_VerticalButtonOrientationSlide()
if (not ChatBarFrame.isMoving) then
ChatBar_VerticalDisplay_Sliding = true;
ChatBar_StartSlidingTo(16);
end
end
function ChatBar_Toggle_AlternateButtonOrientationSlide()
if (not ChatBarFrame.isMoving) then
ChatBar_AlternateDisplay_Sliding = true;
ChatBar_StartSlidingTo(16);
end
end
function ChatBar_Toggle_VerticalButtonOrientation()
if (ChatBar_VerticalDisplay) then
ChatBar_VerticalDisplay = false;
else
ChatBar_VerticalDisplay = true;
end
--ChatBar_UpdateOrientationPoint();
ChatBar_UpdateButtonOrientation();
ChatBar_UpdateButtons();
end
function ChatBar_UpdateOrientationPoint(expanded)
local x, y;
if (ChatBarFrame:IsUserPlaced()) then
if (expanded) then
if (ChatBar_AlternateOrientation) then
x = ChatBarFrame:GetRight();
y = ChatBarFrame:GetTop();
ChatBarFrame:ClearAllPoints();
ChatBarFrame:SetPoint("TOPRIGHT", "UIParent", "BOTTOMLEFT", x, y);
else
x = ChatBarFrame:GetLeft();
y = ChatBarFrame:GetBottom();
ChatBarFrame:ClearAllPoints();
ChatBarFrame:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", x, y);
end
else
if (ChatBar_AlternateOrientation) then
x = ChatBarFrame:GetLeft()+16;
y = ChatBarFrame:GetBottom()+16;
ChatBarFrame:ClearAllPoints();
ChatBarFrame:SetPoint("TOPRIGHT", "UIParent", "BOTTOMLEFT", x, y);
else
x = ChatBarFrame:GetRight()-16;
y = ChatBarFrame:GetTop()-16;
ChatBarFrame:ClearAllPoints();
ChatBarFrame:SetPoint("BOTTOMLEFT", "UIParent", "BOTTOMLEFT", x, y);
end
end
else
if (ChatBar_AlternateOrientation) then
ChatBarFrame:ClearAllPoints();
ChatBarFrame:SetPoint("TOPRIGHT", "ChatFrame1", "TOPLEFT", 16, 46);
else
ChatBarFrame:ClearAllPoints();
ChatBarFrame:SetPoint("BOTTOMLEFT", "ChatFrame1", "TOPLEFT", 0, 30);
end
end
end
function ChatBar_Toggle_AlternateButtonOrientation()
if (ChatBar_AlternateOrientation) then
ChatBar_AlternateOrientation = false;
else
ChatBar_AlternateOrientation = true;
end
--ChatBar_UpdateOrientationPoint();
ChatBar_UpdateButtonOrientation();
ChatBar_UpdateButtons();
end
function ChatBar_Toggle_TextOrientation()
if (ChatBar_TextOnButtonDisplay) then
ChatBar_TextOnButtonDisplay = false;
else
ChatBar_TextOnButtonDisplay = true;
end
ChatBar_UpdateButtonOrientation();
end
function ChatBar_Toggle_ButtonFlashing()
if (ChatBar_ButtonFlashing) then
ChatBar_ButtonFlashing = false;
else
ChatBar_ButtonFlashing = true;
end
ChatBar_UpdateButtonFlashing();
end
function ChatBar_Toggle_BarBorder()
if (ChatBar_BarBorder) then
ChatBar_BarBorder = false;
else
ChatBar_BarBorder = true;
end
ChatBar_UpdateBarBorder();
end
function ChatBar_Toggle_HideSpecialChannels()
if (ChatBar_HideSpecialChannels) then
ChatBar_HideSpecialChannels = false;
else
ChatBar_HideSpecialChannels = true;
end
ChatBar_UpdateButtons();
end
function ChatBar_UpdateButtonText()
if (ChatBar_ButtonText) then
for i=1, CHAT_BAR_MAX_BUTTONS do
local button = getglobal("ChatBarFrameButton"..i);
button.Text:Show();
end
else
for i=1, CHAT_BAR_MAX_BUTTONS do
local button = getglobal("ChatBarFrameButton"..i);
button.Text:Hide();
end
end
end
function ChatBar_Toggle_ButtonText()
if (ChatBar_ButtonText) then
ChatBar_ButtonText = false;
else
ChatBar_ButtonText = true;
end
ChatBar_UpdateButtonText();
end
function ChatBar_Toggle_TextChannelNumbers()
if (ChatBar_TextChannelNumbers) then
ChatBar_TextChannelNumbers = false;
else
ChatBar_TextChannelNumbers = true;
end
ChatBar_UpdateButtons();
end
--------------------------------------------------
-- Helper Functions
--------------------------------------------------
function ChatBar_GetTableSize(t)
local i=0;
for k,v in t do
if (k and v) then i=i+1 end;
end
return i;
end
function ChatBar_GetFirstWord(s)
local firstWord, count = gsub(s, "%s.*", "")
return firstWord;
end
--------------------------------------------------
-- Reorder Channels
--------------------------------------------------
-- Standard Channel Order
STANDARD_CHANNEL_ORDER = {
[CHATBAR_GENERAL] = 1,
[CHATBAR_TRADE] = 2,
[CHATBAR_LOCALDEFENSE] = 3,
[CHATBAR_LFG] = 4,
[CHATBAR_WORLDDEFENSE] = 5,
[CHATBAR_GUILDRECRUITMENT] = 6,
};
BOGUS_CHANNELS = {
"morneusgbyfyh",
"akufbhfeuinjke",
"lkushawdewui",
"auwdbadwwho",
"uawhbliuernb",
"nvcuoiisnejfk",
"cmewhumimr",
"cliuchbwubine",
"omepwucbawy",
"yuiwbefmopou"
};
CHATBAR_CAPITAL_CITIES = {
[CHATBAR_ORGRIMMAR] = 1,
[CHATBAR_STORMWIND] = 1,
[CHATBAR_IRONFORGE] = 1,
[CHATBAR_DARNASSUS] = 1,
[CHATBAR_UNDERCITY] = 1,
[CHATBAR_THUNDERBLUFF] = 1,
};
--
-- reorderChannels()
-- Stores current channels, Leaves all channels and then rejoins them in a standard ordering.
--
--
function ChatBar_ReorderChannels()
if UnitOnTaxi("player") then
Sea.io.printfc(SELECTED_CHAT_FRAME, ChatTypeInfo["SYSTEM"], CHATBAR_REORDER_FLIGHT_FAIL);
-- For some reason channels do not register join/leave in a reasonable amount of time while in transit.
return;
end
local newChannelOrder = {};
local openChannelIndex = 1;
local currIdentifier, simpleName, inGlobalComm, _;
--Get Channel List
local list = {GetChannelList()};
local currChannelList = {};
for i=1, getn(list), 2 do
table.insert(currChannelList, tonumber(list[i]), list[i+1]);
end
-- Find current standard channels: store and leave
for index, chanName in currChannelList do
if (type(chanName) == "string") then
_, _, simpleName = strfind(chanName, "(%w+).*");
if (STANDARD_CHANNEL_ORDER[simpleName]) then
if ( simpleName == "GlobalComm" ) then
inGlobalComm = true;
else
newChannelOrder[STANDARD_CHANNEL_ORDER[simpleName]] = simpleName;
end
LeaveChannelByName(chanName);
currChannelList[index] = nil;
end
end
end
--Sea.io.printTable(currChannelList);
-- Find current non-standard channels: store and leave
for index, chanName in currChannelList do
if (type(chanName) == "string") then
while (newChannelOrder[openChannelIndex]) do
openChannelIndex = openChannelIndex + 1;
end
newChannelOrder[openChannelIndex] = chanName;
LeaveChannelByName(chanName);
openChannelIndex = openChannelIndex + 1;
end
end
if (inGlobalComm) then
while (newChannelOrder[openChannelIndex]) do
openChannelIndex = openChannelIndex + 1;
end
newChannelOrder[openChannelIndex] = "GlobalComm";
end
--Sea.io.printTable(newChannelOrder);
Sea.io.print(CHATBAR_REORDER_START);
Chronos.schedule(.6, ChatBar_joinChannelsInOrder, newChannelOrder);
Chronos.schedule(1.2, function() Sea.io.print(CHATBAR_REORDER_END); end );
Chronos.schedule(2, ListChannels );
end
function ChatBar_joinChannelsInOrder(newChannelOrder)
local inACity = CHATBAR_CAPITAL_CITIES[GetRealZoneText()];
-- Join channels in new order
for i=1, 10 do
if (newChannelOrder[i]) then
if (ChannelManager_CustomChannelPasswords) and (ChannelManager_CustomChannelPasswords[newChannelOrder[i]]) then
JoinChannelByName(newChannelOrder[i], ChannelManager_CustomChannelPasswords[newChannelOrder[i]]);
else
JoinChannelByName(newChannelOrder[i]);
end
else
-- Allow for hidden trade channel (Unfortunetly if you're not in a city and aren't in trade then numbers will be slightly off)
if (inACity) or (STANDARD_CHANNEL_ORDER[CHATBAR_TRADE] ~= i) then
JoinChannelByName(BOGUS_CHANNELS[i]);
end
end
end
Chronos.schedule(.6, ChatBar_leaveExtraChannels, newChannelOrder );
end
function ChatBar_leaveExtraChannels(newChannelOrder)
for i, bogusName in BOGUS_CHANNELS do
local channelNum, channelName = GetChannelName(bogusName);
if (channelName) then
LeaveChannelByName(channelNum);
end
end
end