FRIENDS_TO_DISPLAY = 10; FRIENDS_FRAME_FRIEND_HEIGHT = 34; IGNORES_TO_DISPLAY = 19; FRIENDS_FRAME_IGNORE_HEIGHT = 16; PENDING_INVITES_TO_DISPLAY = 4; PENDING_BUTTON_MIN_HEIGHT = 92; FRIENDS_FRIENDS_TO_DISPLAY = 11; FRIENDS_FRAME_FRIENDS_FRIENDS_HEIGHT = 16; MAX_INVITE_MESSAGE_LINES = 10; MAX_INVITE_MESSAGE_HEIGHT = 0; -- automatically set in FriendsFramePendingScrollFrame:OnLoad WHOS_TO_DISPLAY = 17; FRIENDS_FRAME_WHO_HEIGHT = 16; GUILDMEMBERS_TO_DISPLAY = 13; FRIENDS_FRAME_GUILD_HEIGHT = 14; MAX_WHOS_FROM_SERVER = 50; MAX_GUILDCONTROL_OPTIONS = 12; CURRENT_GUILD_MOTD = ""; GUILD_DETAIL_NORM_HEIGHT = 195 GUILD_DETAIL_OFFICER_HEIGHT = 255 MAX_GUILDBANK_TABS = 6; MAX_GOLD_WITHDRAW = 1000; GUILDEVENT_TRANSACTION_HEIGHT = 13; MAX_EVENTS_SHOWN = 25; MAX_GOLD_WITHDRAW_DIGITS = 9; PENDING_GUILDBANK_PERMISSIONS = {}; FRIENDS_BUTTON_HEADER_HEIGHT = 16; FRIENDS_BUTTON_NORMAL_HEIGHT = 34; FRIENDS_BUTTON_LARGE_HEIGHT = 48; FRIENDS_BUTTON_TYPE_HEADER = 1; FRIENDS_BUTTON_TYPE_BNET = 2; FRIENDS_BUTTON_TYPE_WOW = 3; FRIENDS_TEXTURE_ONLINE = "Interface\\FriendsFrame\\StatusIcon-Online"; FRIENDS_TEXTURE_AFK = "Interface\\FriendsFrame\\StatusIcon-Away"; FRIENDS_TEXTURE_DND = "Interface\\FriendsFrame\\StatusIcon-DnD"; FRIENDS_TEXTURE_OFFLINE = "Interface\\FriendsFrame\\StatusIcon-Offline"; FRIENDS_TEXTURE_BROADCAST = "Interface\\FriendsFrame\\BroadcastIcon"; FRIENDS_BNET_NAME_COLOR = {r=0.510, g=0.773, b=1.0}; FRIENDS_BNET_BACKGROUND_COLOR = {r=0, g=0.694, b=0.941, a=0.05}; FRIENDS_WOW_NAME_COLOR = {r=0.996, g=0.882, b=0.361}; FRIENDS_WOW_BACKGROUND_COLOR = {r=1.0, g=0.824, b=0.0, a=0.05}; FRIENDS_GRAY_COLOR = {r=0.486, g=0.518, b=0.541}; FRIENDS_OFFLINE_BACKGROUND_COLOR = {r=0.588, g=0.588, b=0.588, a=0.05}; FRIENDS_PRESENCE_COLOR_CODE = "|cff7c848a"; FRIENDS_BNET_NAME_COLOR_CODE = "|cff82c5ff"; FRIENDS_BROADCAST_TIME_COLOR_CODE = "|cff4381a8" FRIENDS_WOW_NAME_COLOR_CODE = "|cfffde05c"; FRIENDS_OTHER_NAME_COLOR_CODE = "|cff7b8489"; SQUELCH_TYPE_IGNORE = 1; SQUELCH_TYPE_BLOCK_INVITE = 2; SQUELCH_TYPE_MUTE = 3; SQUELCH_TYPE_BLOCK_TOON = 4; FRIENDS_FRIENDS_POTENTIAL = 1; FRIENDS_FRIENDS_MUTUAL = 2; FRIENDS_FRIENDS_ALL = 3; BNET_CLIENT_WOW = "WoW"; BNET_CLIENT_SC2 = "S2"; FRIENDS_TOOLTIP_MAX_TOONS = 5; FRIENDS_TOOLTIP_MAX_WIDTH = 200; FRIENDS_TOOLTIP_MARGIN_WIDTH = 12; local FriendButtons = { }; local BNetBroadcasts = { }; local totalScrollHeight = 0; local numOnlineBroadcasts = 0; local numOfflineBroadcasts = 0; local PendingInvitesNew = { }; local playerRealmName; local playerFactionGroup; WHOFRAME_DROPDOWN_LIST = { {name = ZONE, sortType = "zone"}, {name = GUILD, sortType = "guild"}, {name = RACE, sortType = "race"} }; FRIENDSFRAME_SUBFRAMES = { "FriendsListFrame", "IgnoreListFrame", "PendingListFrame", "WhoFrame", "GuildFrame", "ChannelFrame", "RaidFrame" }; function FriendsFrame_ShowSubFrame(frameName) for index, value in pairs(FRIENDSFRAME_SUBFRAMES) do if ( value == frameName ) then _G[value]:Show() else _G[value]:Hide(); end end end function FriendsFrame_SummonButton_OnEvent (self, event, ...) if ( event == "SPELL_UPDATE_COOLDOWN" and self:GetParent().id ) then FriendsFrame_SummonButton_Update(self); end end function FriendsFrame_SummonButton_OnShow (self) FriendsFrame_SummonButton_Update(self); end function FriendsFrame_SummonButton_Update (self) local id = self:GetParent().id; if ( not id or (self:GetParent().buttonType ~= FRIENDS_BUTTON_TYPE_WOW) or not IsReferAFriendLinked(GetFriendInfo(id)) ) then self:Hide(); return; end self:Show(); local start, duration = GetSummonFriendCooldown(); if ( duration > 0 ) then self.duration = duration; self.start = start; else self.duration = nil; self.start = nil; end local enable = CanSummonFriend(GetFriendInfo(id)); local icon = _G[self:GetName().."Icon"]; local normalTexture = _G[self:GetName().."NormalTexture"]; if ( enable ) then icon:SetVertexColor(1.0, 1.0, 1.0); normalTexture:SetVertexColor(1.0, 1.0, 1.0); else icon:SetVertexColor(0.4, 0.4, 0.4); normalTexture:SetVertexColor(1.0, 1.0, 1.0); end CooldownFrame_SetTimer(_G[self:GetName().."Cooldown"], start, duration, ((enable and 0) or 1)); end function FriendsFrame_ClickSummonButton (self) local name = GetFriendInfo(self:GetParent().id); if ( CanSummonFriend(name) ) then SummonFriend(name); end end function FriendsFrame_ShowDropdown(name, connected, lineID, chatType, chatFrame, friendsList) HideDropDownMenu(1); if ( connected or friendsList ) then if ( connected ) then FriendsDropDown.initialize = FriendsFrameDropDown_Initialize; else FriendsDropDown.initialize = FriendsFrameOfflineDropDown_Initialize; end FriendsDropDown.displayMode = "MENU"; FriendsDropDown.name = name; FriendsDropDown.friendsList = friendsList; FriendsDropDown.lineID = lineID; FriendsDropDown.chatType = chatType; FriendsDropDown.chatTarget = name; FriendsDropDown.chatFrame = chatFrame; FriendsDropDown.presenceID = nil; ToggleDropDownMenu(1, nil, FriendsDropDown, "cursor"); end end function FriendsFrame_ShowBNDropdown(name, connected, lineID, chatType, chatFrame, friendsList, presenceID) if ( connected or friendsList ) then if ( connected ) then FriendsDropDown.initialize = FriendsFrameBNDropDown_Initialize; else FriendsDropDown.initialize = FriendsFrameBNOfflineDropDown_Initialize; end FriendsDropDown.displayMode = "MENU"; FriendsDropDown.name = name; FriendsDropDown.friendsList = friendsList; FriendsDropDown.lineID = lineID; FriendsDropDown.chatType = chatType; FriendsDropDown.chatTarget = name; FriendsDropDown.chatFrame = chatFrame; FriendsDropDown.presenceID = presenceID; ToggleDropDownMenu(1, nil, FriendsDropDown, "cursor"); end end function FriendsFrameDropDown_Initialize() UnitPopup_ShowMenu(UIDROPDOWNMENU_OPEN_MENU, "FRIEND", nil, FriendsDropDown.name); end function FriendsFrameOfflineDropDown_Initialize() UnitPopup_ShowMenu(UIDROPDOWNMENU_OPEN_MENU, "FRIEND_OFFLINE", nil, FriendsDropDown.name); end function FriendsFrameBNDropDown_Initialize() UnitPopup_ShowMenu(UIDROPDOWNMENU_OPEN_MENU, "BN_FRIEND", nil, FriendsDropDown.name); end function FriendsFrameBNOfflineDropDown_Initialize() UnitPopup_ShowMenu(UIDROPDOWNMENU_OPEN_MENU, "BN_FRIEND_OFFLINE", nil, FriendsDropDown.name); end function FriendsFrame_OnLoad(self) PanelTemplates_SetNumTabs(self, 5); self.selectedTab = 1; PanelTemplates_UpdateTabs(self); self:RegisterEvent("FRIENDLIST_SHOW"); self:RegisterEvent("FRIENDLIST_UPDATE"); self:RegisterEvent("IGNORELIST_UPDATE"); self:RegisterEvent("MUTELIST_UPDATE"); self:RegisterEvent("WHO_LIST_UPDATE"); self:RegisterEvent("GUILD_ROSTER_UPDATE"); self:RegisterEvent("PLAYER_GUILD_UPDATE"); self:RegisterEvent("GUILD_MOTD"); self:RegisterEvent("VOICE_CHAT_ENABLED_UPDATE"); self:RegisterEvent("PARTY_MEMBERS_CHANGED"); self:RegisterEvent("PLAYER_FLAGS_CHANGED"); self:RegisterEvent("BN_FRIEND_LIST_SIZE_CHANGED"); self:RegisterEvent("BN_FRIEND_INFO_CHANGED"); self:RegisterEvent("BN_FRIEND_INVITE_LIST_INITIALIZED"); self:RegisterEvent("BN_FRIEND_INVITE_ADDED"); self:RegisterEvent("BN_FRIEND_INVITE_REMOVED"); self:RegisterEvent("BN_CUSTOM_MESSAGE_CHANGED"); self:RegisterEvent("BN_CUSTOM_MESSAGE_LOADED"); self:RegisterEvent("BN_SELF_ONLINE"); self:RegisterEvent("BN_BLOCK_LIST_UPDATED"); self:RegisterEvent("PLAYER_ENTERING_WORLD"); self:RegisterEvent("BN_CONNECTED"); self:RegisterEvent("BN_DISCONNECTED"); self.playersInBotRank = 0; self.playerStatusFrame = 1; self.selectedFriend = 1; self.selectedIgnore = 1; self.guildStatus = 0; GuildFrame.notesToggle = 1; GuildFrame.selectedGuildMember = 0; SetGuildRosterSelection(0); CURRENT_GUILD_MOTD = GetGuildRosterMOTD(); GuildFrameNotesText:SetText(CURRENT_GUILD_MOTD); GuildMemberDetailRankText:SetPoint("RIGHT", GuildFramePromoteButton, "LEFT"); -- friends list DynamicScrollFrame_CreateButtons(FriendsFrameFriendsScrollFrame, "FriendsFrameButtonTemplate", FRIENDS_BUTTON_HEADER_HEIGHT, FriendsFrame_SetButton, FriendsFrame_GetTopButton); FriendsFrameOfflineHeader:SetParent(FriendsFrameFriendsScrollFrameScrollChild); FriendsFrameBroadcastInputClearButton.icon:SetVertexColor(FRIENDS_BNET_NAME_COLOR.r, FRIENDS_BNET_NAME_COLOR.g, FRIENDS_BNET_NAME_COLOR.b); if ( not BNFeaturesEnabled() ) then FriendsTabHeaderTab3:Hide(); FriendsFrameBroadcastInput:Hide(); FriendsFrameBattlenetStatus:Hide(); FriendsFrameStatusDropDown:Show(); end end function FriendsFrame_OnShow() VoiceChat_Toggle(); FriendsList_Update(); FriendsFrame_Update(); UpdateMicroButtons(); PlaySound("igCharacterInfoTab"); GuildFrame.selectedGuildMember = 0; SetGuildRosterSelection(0); InGuildCheck(); end function FriendsFrame_Update() if ( FriendsFrame.selectedTab == 1 ) then FriendsTabHeader:Show(); if ( FriendsTabHeader.selectedTab == 1 ) then ShowFriends(); FriendsFrameTopLeft:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrame-TopLeft-bnet"); FriendsFrameTopRight:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrame-TopRight-bnet"); FriendsFrameBottomLeft:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrameMute-BotLeft-bnet"); FriendsFrameBottomRight:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrameMute-BotRight-bnet"); FriendsFrameTitleText:SetText(FRIENDS_LIST); FriendsFrame_ShowSubFrame("FriendsListFrame"); elseif ( FriendsTabHeader.selectedTab == 3 ) then FriendsFrameTopLeft:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrame-TopLeft-bnet"); FriendsFrameTopRight:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrame-TopRight-bnet"); FriendsFrameBottomRight:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrame-Pending-BotRight"); FriendsFrameBottomLeft:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrame-Pending-BotLeft"); FriendsFrameTitleText:SetText(PENDING_INVITE_LIST); FriendsFrame_ShowSubFrame("PendingListFrame"); else FriendsFrameTopLeft:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrame-TopLeft-bnet"); FriendsFrameTopRight:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrame-TopRight-bnet"); if ( IsVoiceChatEnabled() ) then FriendsFrameMutePlayerButton:Show(); FriendsFrameBottomLeft:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrameThree-BotLeft-bnet"); FriendsFrameBottomRight:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrameThree-BotRight-bnet"); FriendsFrameIgnorePlayerButton:SetWidth(110); FriendsFrameUnsquelchButton:SetWidth(111); else FriendsFrameMutePlayerButton:Hide(); FriendsFrameBottomLeft:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrameMute-BotLeft-bnet"); FriendsFrameBottomRight:SetTexture("Interface\\FriendsFrame\\UI-FriendsFrameMute-BotRight-bnet"); FriendsFrameIgnorePlayerButton:SetWidth(131); FriendsFrameUnsquelchButton:SetWidth(134); end FriendsFrameTitleText:SetText(IGNORE_LIST); FriendsFrame_ShowSubFrame("IgnoreListFrame"); IgnoreList_Update(); end else FriendsTabHeader:Hide(); if ( FriendsFrame.selectedTab == 2 ) then FriendsFrameTopLeft:SetTexture("Interface\\ClassTrainerFrame\\UI-ClassTrainer-TopLeft"); FriendsFrameTopRight:SetTexture("Interface\\ClassTrainerFrame\\UI-ClassTrainer-TopRight"); FriendsFrameBottomLeft:SetTexture("Interface\\FriendsFrame\\WhoFrame-BotLeft"); FriendsFrameBottomRight:SetTexture("Interface\\FriendsFrame\\WhoFrame-BotRight"); FriendsFrameTitleText:SetText(WHO_LIST); FriendsFrame_ShowSubFrame("WhoFrame"); WhoList_Update(); elseif ( FriendsFrame.selectedTab == 3 ) then FriendsFrameTopLeft:SetTexture("Interface\\ClassTrainerFrame\\UI-ClassTrainer-TopLeft"); FriendsFrameTopRight:SetTexture("Interface\\ClassTrainerFrame\\UI-ClassTrainer-TopRight"); FriendsFrameBottomLeft:SetTexture("Interface\\FriendsFrame\\GuildFrame-BotLeft"); FriendsFrameBottomRight:SetTexture("Interface\\FriendsFrame\\GuildFrame-BotRight"); local guildName, title, rank = GetGuildInfo("player"); if ( guildName ) then FriendsFrameTitleText:SetFormattedText(GUILD_TITLE_TEMPLATE, title, guildName); else FriendsFrameTitleText:SetText(""); end GuildStatus_Update(); FriendsFrame_ShowSubFrame("GuildFrame"); elseif ( FriendsFrame.selectedTab == 4 ) then FriendsFrameTopLeft:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-General-TopLeft"); FriendsFrameTopRight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-General-TopRight"); FriendsFrameBottomLeft:SetTexture("Interface\\FriendsFrame\\UI-ChannelFrame-BotLeft"); FriendsFrameBottomRight:SetTexture("Interface\\FriendsFrame\\UI-ChannelFrame-BotRight"); FriendsFrameTitleText:SetText(CHAT_CHANNELS); FriendsFrame_ShowSubFrame("ChannelFrame"); elseif ( FriendsFrame.selectedTab == 5 ) then FriendsFrameTopLeft:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-General-TopLeft"); FriendsFrameTopRight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-General-TopRight"); FriendsFrameBottomLeft:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-General-BottomLeft"); FriendsFrameBottomRight:SetTexture("Interface\\PaperDollInfoFrame\\UI-Character-General-BottomRight"); FriendsFrameTitleText:SetText(RAID); FriendsFrame_ShowSubFrame("RaidFrame"); end end end function FriendsFrame_OnHide() UpdateMicroButtons(); PlaySound("igMainMenuClose"); SetGuildRosterSelection(0); GuildFrame.selectedGuildMember = 0; GuildFramePopup_HideAll(); RaidInfoFrame:Hide(); for index, value in pairs(FRIENDSFRAME_SUBFRAMES) do _G[value]:Hide(); end end function FriendsList_Update() local numBNetTotal, numBNetOnline = BNGetNumFriends(); local numBNetOffline = numBNetTotal - numBNetOnline; local numWoWTotal, numWoWOnline = GetNumFriends(); local numWoWOffline = numWoWTotal - numWoWOnline; FriendsMicroButtonCount:SetText(numBNetOnline + numWoWOnline); if ( not FriendsListFrame:IsShown() ) then return; end local buttonCount = numBNetTotal + numWoWTotal; local haveHeader; totalScrollHeight = 0; if ( numBNetOnline > 0 or numWoWOnline > 0 ) then totalScrollHeight = totalScrollHeight + (numBNetOnline + numWoWOnline) * FRIENDS_BUTTON_NORMAL_HEIGHT + numOnlineBroadcasts * (FRIENDS_BUTTON_LARGE_HEIGHT - FRIENDS_BUTTON_NORMAL_HEIGHT); end if ( numBNetOffline > 0 or numWoWOffline > 0 ) then totalScrollHeight = totalScrollHeight + (numBNetOffline + numWoWOffline) * FRIENDS_BUTTON_NORMAL_HEIGHT + numOfflineBroadcasts * (FRIENDS_BUTTON_LARGE_HEIGHT - FRIENDS_BUTTON_NORMAL_HEIGHT); -- use a header if there are online and offline friends if ( numBNetOnline > 0 or numWoWOnline > 0 ) then haveHeader = true; buttonCount = buttonCount + 1; totalScrollHeight = totalScrollHeight + FRIENDS_BUTTON_HEADER_HEIGHT; end end if ( buttonCount > #FriendButtons ) then for i = #FriendButtons + 1, buttonCount do FriendButtons[i] = { }; end end local index = 0; -- online Battlenet friends for i = 1, numBNetOnline do index = index + 1; FriendButtons[index].buttonType = FRIENDS_BUTTON_TYPE_BNET; FriendButtons[index].id = i; end -- online WoW friends for i = 1, numWoWOnline do index = index + 1; FriendButtons[index].buttonType = FRIENDS_BUTTON_TYPE_WOW; FriendButtons[index].id = i; end -- offline header if ( haveHeader ) then index = index + 1; FriendButtons[index].buttonType = FRIENDS_BUTTON_TYPE_HEADER; end -- offline Battlenet friends for i = 1, numBNetOffline do index = index + 1; FriendButtons[index].buttonType = FRIENDS_BUTTON_TYPE_BNET; FriendButtons[index].id = i + numBNetOnline; end -- offline WoW friends for i = 1, numWoWOffline do index = index + 1; FriendButtons[index].buttonType = FRIENDS_BUTTON_TYPE_WOW; FriendButtons[index].id = i + numWoWOnline; end -- selection local selectedFriend = 0; -- check that we have at least 1 friend if ( index > 0 ) then -- get friend if ( FriendsFrame.selectedFriendType == FRIENDS_BUTTON_TYPE_WOW ) then selectedFriend = GetSelectedFriend(); elseif ( FriendsFrame.selectedFriendType == FRIENDS_BUTTON_TYPE_BNET ) then selectedFriend = BNGetSelectedFriend(); end -- set to first in list if no friend if ( selectedFriend == 0 ) then FriendsFrame_SelectFriend(FriendButtons[1].buttonType, 1); selectedFriend = 1; end -- check if friend is online local isOnline; if ( FriendsFrame.selectedFriendType == FRIENDS_BUTTON_TYPE_WOW ) then local name, level, class, area; name, level, class, area, isOnline = GetFriendInfo(selectedFriend); elseif ( FriendsFrame.selectedFriendType == FRIENDS_BUTTON_TYPE_BNET ) then local presenceID, givenName, surname, toonName, toonID, client; presenceID, givenName, surname, toonName, toonID, client, isOnline = BNGetFriendInfo(selectedFriend); if ( not givenName or not surname ) then isOnline = false; end end if ( isOnline ) then FriendsFrameSendMessageButton:Enable(); else FriendsFrameSendMessageButton:Disable(); end else FriendsFrameSendMessageButton:Disable(); end FriendsFrame.selectedFriend = selectedFriend; DynamicScrollFrame_Update(FriendsFrameFriendsScrollFrame); end function IgnoreList_Update() local button; local numIgnores = GetNumIgnores(); local numBlocks = BNGetNumBlocked(); local numToonBlocks = BNGetNumBlockedToons(); local numMutes = 0; if ( IsVoiceChatEnabled() ) then numMutes = GetNumMutes(); end -- Headers stuff local ignoredHeader, blockedHeader, mutedHeader, blockedToonHeader; if ( numIgnores > 0 ) then ignoredHeader = 1; else ignoredHeader = 0; end if ( numBlocks > 0 ) then blockedHeader = 1; else blockedHeader = 0; end if ( numToonBlocks > 0 ) then blockedToonHeader = 1; else blockedToonHeader = 0; end if ( numMutes > 0 ) then mutedHeader = 1; else mutedHeader = 0; end local lastIgnoredIndex = numIgnores + ignoredHeader; local lastBlockedIndex = lastIgnoredIndex + numBlocks + blockedHeader; local lastBlockedToonIndex = lastBlockedIndex + numToonBlocks + blockedToonHeader; local lastMutedIndex = lastBlockedToonIndex + numMutes + mutedHeader; local numEntries = lastMutedIndex; FriendsFrameIgnoredHeader:Hide(); FriendsFrameBlockedInviteHeader:Hide(); FriendsFrameBlockedToonHeader:Hide(); FriendsFrameMutedHeader:Hide(); -- selection stuff local selectedSquelchType = FriendsFrame.selectedSquelchType; local selectedSquelchIndex = 0 ; if ( selectedSquelchType == SQUELCH_TYPE_IGNORE ) then selectedSquelchIndex = GetSelectedIgnore(); elseif ( selectedSquelchType == SQUELCH_TYPE_BLOCK_INVITE ) then selectedSquelchIndex = BNGetSelectedBlock(); elseif ( selectedSquelchType == SQUELCH_TYPE_BLOCK_TOON ) then selectedSquelchIndex = BNGetSelectedToonBlock(); elseif ( selectedSquelchType == SQUELCH_TYPE_MUTE ) then selectedSquelchIndex = GetSelectedMute(); end if ( selectedSquelchIndex == 0 ) then if ( numIgnores > 0 ) then FriendsFrame_SelectSquelched(SQUELCH_TYPE_IGNORE, 1); selectedSquelchType = SQUELCH_TYPE_IGNORE; selectedSquelchIndex = 1; elseif ( numBlocks > 0 ) then FriendsFrame_SelectSquelched(SQUELCH_TYPE_BLOCK_INVITE, 1); selectedSquelchType = SQUELCH_TYPE_BLOCK_INVITE; selectedSquelchIndex = 1; elseif ( numToonBlocks > 0 ) then FriendsFrame_SelectSquelched(SQUELCH_TYPE_BLOCK_TOON, 1); selectedSquelchType = SQUELCH_TYPE_BLOCK_TOON; selectedSquelchIndex = 1; elseif ( numMutes > 0 ) then FriendsFrame_SelectSquelched(SQUELCH_TYPE_MUTE, 1); selectedSquelchType = SQUELCH_TYPE_MUTE; selectedSquelchIndex = 1; end end if ( selectedSquelchIndex > 0 ) then FriendsFrameUnsquelchButton:Enable(); else FriendsFrameUnsquelchButton:Disable(); end local scrollOffset = FauxScrollFrame_GetOffset(FriendsFrameIgnoreScrollFrame); local squelchedIndex; for i = 1, IGNORES_TO_DISPLAY, 1 do squelchedIndex = i + scrollOffset; button = _G["FriendsFrameIgnoreButton"..i]; button.type = nil; if ( squelchedIndex == ignoredHeader ) then -- ignored header IgnoreList_SetHeader(FriendsFrameIgnoredHeader, button); elseif ( squelchedIndex <= lastIgnoredIndex ) then -- ignored button.index = squelchedIndex - ignoredHeader; button.name:SetText(GetIgnoreName(button.index)); button.type = SQUELCH_TYPE_IGNORE; elseif ( blockedHeader == 1 and squelchedIndex == lastIgnoredIndex + 1 ) then -- blocked header IgnoreList_SetHeader(FriendsFrameBlockedInviteHeader, button); elseif ( squelchedIndex <= lastBlockedIndex ) then -- blocked button.index = squelchedIndex - lastIgnoredIndex - blockedHeader; local blockID, blockName = BNGetBlockedInfo(button.index); button.name:SetText(blockName); button.type = SQUELCH_TYPE_BLOCK_INVITE; elseif ( blockedToonHeader == 1 and squelchedIndex == lastBlockedIndex + 1 ) then -- blocked TOON header IgnoreList_SetHeader(FriendsFrameBlockedToonHeader, button); elseif ( squelchedIndex <= lastBlockedToonIndex ) then -- blocked TOON button.index = squelchedIndex - lastBlockedIndex - blockedToonHeader; local blockID, blockName = BNGetBlockedToonInfo(button.index); button.name:SetText(blockName); button.type = SQUELCH_TYPE_BLOCK_TOON; elseif ( mutedHeader == 1 and squelchedIndex == lastBlockedToonIndex + 1 ) then -- muted header IgnoreList_SetHeader(FriendsFrameMutedHeader, button); elseif ( squelchedIndex <= lastMutedIndex ) then -- muted button.index = squelchedIndex - lastBlockedToonIndex - mutedHeader; button.name:SetText(GetMuteName(button.index)); button.type = SQUELCH_TYPE_MUTE; end if ( selectedSquelchType == button.type and selectedSquelchIndex == button.index ) then button:LockHighlight(); else button:UnlockHighlight(); end if ( squelchedIndex > numEntries ) then button:Hide(); else button:Show(); end end -- ScrollFrame stuff FauxScrollFrame_Update(FriendsFrameIgnoreScrollFrame, numEntries, IGNORES_TO_DISPLAY, FRIENDS_FRAME_IGNORE_HEIGHT ); end function IgnoreList_SetHeader(header, parent) parent.name:SetText(""); header:SetParent(parent); header:SetPoint("TOPLEFT", parent, 0, 0); header:Show(); end function PendingListFrame_OnShow(self) PendingList_Update(); end function PendingList_Update(newInvite) local numPending = BNGetNumFriendInvites(); PendingList_UpdateTab(); if ( numPending > 0 ) then if ( not GetCVarBool("pendingInviteInfoShown") ) then PendingListInfoFrame:SetFrameLevel(FriendsFramePendingButton1:GetFrameLevel() + 1); PendingListInfoFrame:Show(); end local scrollFrame = FriendsFramePendingScrollFrame; local buttonHeight, message, _; local heightLeft = scrollFrame.scrollHeight; local scrollBar = scrollFrame.scrollBar; FriendsFramePendingButton1.message:SetHeight(0); for i = numPending, 1, -1 do buttonHeight = PENDING_BUTTON_MIN_HEIGHT; _, _, _, message = BNGetFriendInviteInfo(i); if ( message and message ~= "" ) then FriendsFramePendingButton1.message:SetText(message); local textHeight = min(FriendsFramePendingButton1.message:GetHeight(), MAX_INVITE_MESSAGE_HEIGHT); buttonHeight = buttonHeight + textHeight; end heightLeft = heightLeft - buttonHeight; if ( heightLeft <= 0 ) then -- one less notch on the scrollbar if it's a perfect fit if ( heightLeft == 0 ) then i = i - 1; end local value = scrollBar:GetValue(); scrollFrame.extraHeight = -heightLeft; scrollFrame.max = i; scrollBar:Show(); scrollBar:SetMinMaxValues(0, i); if ( newInvite ) then -- adjust the scroll if the user is looking at the frame, otherwise jump it to the top if ( PendingListFrame:IsShown() ) then scrollBar:SetValue(value + 1); else scrollBar:SetValue(0) end elseif ( value <= i ) then scrollBar:SetValue(value); PendingList_Scroll(value); end return; end end -- not enough buttons to have a scrollbar scrollFrame.extraHeight = 0; scrollFrame.max = numPending; scrollBar:Hide(); scrollBar:SetValue(0); end PendingList_Scroll(0); end function PendingList_Scroll(offset) local button, buttonHeight; local name, surname, message; local heightUsed = 0; local scrollFrame = FriendsFramePendingScrollFrame; local scrollHeight = scrollFrame.scrollHeight; local max = scrollFrame.max; local numPending = BNGetNumFriendInvites(); offset = offset or scrollFrame.scrollBar:GetValue(); -- if scrolled to the bottom and there would be a button partially showing, start with it and "scroll" it up if ( offset == max and scrollFrame.extraHeight > 0 ) then offset = offset - 1; _G["FriendsFramePendingButton1"]:SetPoint("TOPLEFT", 0, scrollFrame.extraHeight); heightUsed = heightUsed - scrollFrame.extraHeight; else _G["FriendsFramePendingButton1"]:SetPoint("TOPLEFT", 0, 0); end for i = 1, PENDING_INVITES_TO_DISPLAY do button = _G["FriendsFramePendingButton"..i]; offset = offset + 1; if ( offset > numPending or heightUsed > scrollHeight ) then button:Hide(); else inviteID, givenName, surname, message, timeSent, days = BNGetFriendInviteInfo(offset); button.index = offset; button.inviteID = inviteID; buttonHeight = PENDING_BUTTON_MIN_HEIGHT; if ( givenName and surname ) then button.name:SetFormattedText(BATTLENET_NAME_FORMAT, givenName, surname); else button.name:SetText(UNKNOWN); end if ( message ) then button.message:SetHeight(0); button.message:SetText(message); local textHeight = button.message:GetHeight(); if ( textHeight > MAX_INVITE_MESSAGE_HEIGHT ) then textHeight = MAX_INVITE_MESSAGE_HEIGHT; button.message:SetHeight(textHeight); end buttonHeight = buttonHeight + textHeight; else button.message:SetText(""); button.message:SetHeight(0); end if ( timeSent and timeSent ~= 0 ) then button.sent:SetFormattedText(BNET_INVITE_SENT_TIME, FriendsFrame_GetLastOnline(timeSent)); else button.sent:SetText(""); end button:SetHeight(buttonHeight); heightUsed = heightUsed + buttonHeight; if ( PendingInvitesNew["all"] or PendingInvitesNew[inviteID] ) then button.highlight:Show(); else button.highlight:Hide(); end button:Show(); end end end function FriendsFramePendingScrollFrame_AdjustScroll(delta) local scrollBar = FriendsFramePendingScrollFrame.scrollBar; if ( scrollBar:IsShown() ) then scrollBar:SetValue(scrollBar:GetValue() + delta); end end function PendingListFrame_OnHide() table.wipe(PendingInvitesNew); PendingList_UpdateTab(); end function PendingListFrame_BlockCommunication(self) local inviteID, name, surname, message = BNGetFriendInviteInfo(self:GetParent().index); local dialog = StaticPopup_Show("CONFIRM_BLOCK_INVITES", string.format(BATTLENET_NAME_FORMAT, name, surname)); if ( dialog ) then dialog.data = inviteID; end end function PendingListFrame_ReportSpam(self) local inviteID, name, surname, message = BNGetFriendInviteInfo(self:GetParent().index); local dialog = StaticPopup_Show("CONFIRM_REPORT_SPAM_INVITE", string.format(BATTLENET_NAME_FORMAT, name, surname)); if ( dialog ) then dialog.data = inviteID; end end function PendingListFrame_ReportPlayer(self) ToggleDropDownMenu(1, self:GetParent().index, PendingListFrameDropDown, "cursor", 3, -3) end function PendingListFrameDropDown_OnLoad(self) UIDropDownMenu_Initialize(self, PendingListFrameDropDown_Initialize, "MENU"); end function PendingListFrameDropDown_Initialize(self) UnitPopup_ShowMenu(self, "BN_REPORT", nil, BNET_REPORT); end function PendingList_UpdateTab() local numPending = BNGetNumFriendInvites(); if ( numPending > 0 ) then FriendsTabHeaderTab3:SetText(PENDING_INVITE.." ("..numPending..")"); if ( next(PendingInvitesNew) and FriendsTabHeader.selectedTab ~= 3 and not FriendsTabHeaderTab3:IsMouseOver() ) then FriendsTabHeaderInviteAlert:Show(); else FriendsTabHeaderInviteAlert:Hide(); end else FriendsTabHeaderTab3:SetText(PENDING_INVITE); FriendsTabHeaderInviteAlert:Hide(); end PanelTemplates_TabResize(FriendsTabHeaderTab3, 0); end function WhoList_Update() local numWhos, totalCount = GetNumWhoResults(); local name, guild, level, race, class, zone; local button, buttonText, classTextColor, classFileName; local columnTable; local whoOffset = FauxScrollFrame_GetOffset(WhoListScrollFrame); local whoIndex; local showScrollBar = nil; if ( numWhos > WHOS_TO_DISPLAY ) then showScrollBar = 1; end local displayedText = ""; if ( totalCount > MAX_WHOS_FROM_SERVER ) then displayedText = format(WHO_FRAME_SHOWN_TEMPLATE, MAX_WHOS_FROM_SERVER); end WhoFrameTotals:SetText(format(WHO_FRAME_TOTAL_TEMPLATE, totalCount).." "..displayedText); for i=1, WHOS_TO_DISPLAY, 1 do whoIndex = whoOffset + i; button = _G["WhoFrameButton"..i]; button.whoIndex = whoIndex; name, guild, level, race, class, zone, classFileName = GetWhoInfo(whoIndex); columnTable = { zone, guild, race }; if ( classFileName ) then classTextColor = RAID_CLASS_COLORS[classFileName]; else classTextColor = HIGHLIGHT_FONT_COLOR; end buttonText = _G["WhoFrameButton"..i.."Name"]; buttonText:SetText(name); buttonText = _G["WhoFrameButton"..i.."Level"]; buttonText:SetText(level); buttonText = _G["WhoFrameButton"..i.."Class"]; buttonText:SetText(class); buttonText:SetTextColor(classTextColor.r, classTextColor.g, classTextColor.b); local variableText = _G["WhoFrameButton"..i.."Variable"]; variableText:SetText(columnTable[UIDropDownMenu_GetSelectedID(WhoFrameDropDown)]); -- If need scrollbar resize columns if ( showScrollBar ) then variableText:SetWidth(95); else variableText:SetWidth(110); end -- Highlight the correct who if ( WhoFrame.selectedWho == whoIndex ) then button:LockHighlight(); else button:UnlockHighlight(); end if ( whoIndex > numWhos ) then button:Hide(); else button:Show(); end end if ( not WhoFrame.selectedWho ) then WhoFrameGroupInviteButton:Disable(); WhoFrameAddFriendButton:Disable(); else WhoFrameGroupInviteButton:Enable(); WhoFrameAddFriendButton:Enable(); WhoFrame.selectedName = GetWhoInfo(WhoFrame.selectedWho); end -- If need scrollbar resize columns if ( showScrollBar ) then WhoFrameColumn_SetWidth(WhoFrameColumnHeader2, 105); UIDropDownMenu_SetWidth(WhoFrameDropDown, 80); else WhoFrameColumn_SetWidth(WhoFrameColumnHeader2, 120); UIDropDownMenu_SetWidth(WhoFrameDropDown, 95); end -- ScrollFrame update FauxScrollFrame_Update(WhoListScrollFrame, numWhos, WHOS_TO_DISPLAY, FRIENDS_FRAME_WHO_HEIGHT ); PanelTemplates_SetTab(FriendsFrame, 2); ShowUIPanel(FriendsFrame); end function GuildStatus_Update() -- Set the tab PanelTemplates_SetTab(FriendsFrame, 3); -- Show the frame ShowUIPanel(FriendsFrame); -- Number of players in the lowest rank FriendsFrame.playersInBotRank = 0; local numGuildMembers = GetNumGuildMembers(); local name, rank, rankIndex, level, class, zone, note, officernote, online, status, classFileName; local guildName, guildRankName, guildRankIndex = GetGuildInfo("player"); local maxRankIndex = GuildControlGetNumRanks() - 1; local button, buttonText, classTextColor; local onlinecount = 0; local guildIndex; -- Get selected guild member info name, rank, rankIndex, level, class, zone, note, officernote, online = GetGuildRosterInfo(GetGuildRosterSelection()); GuildFrame.selectedName = name; -- If there's a selected guildmember if ( GetGuildRosterSelection() > 0 ) then -- Update the guild member details frame GuildMemberDetailName:SetText(GuildFrame.selectedName); GuildMemberDetailLevel:SetFormattedText(FRIENDS_LEVEL_TEMPLATE, level, class); GuildMemberDetailZoneText:SetText(zone); GuildMemberDetailRankText:SetText(rank); if ( online ) then GuildMemberDetailOnlineText:SetText(GUILD_ONLINE_LABEL); else GuildMemberDetailOnlineText:SetText(GuildFrame_GetLastOnline(GetGuildRosterSelection())); end -- Update public note if ( CanEditPublicNote() ) then PersonalNoteText:SetTextColor(1.0, 1.0, 1.0); if ( (not note) or (note == "") ) then note = GUILD_NOTE_EDITLABEL; end else PersonalNoteText:SetTextColor(0.65, 0.65, 0.65); end GuildMemberNoteBackground:EnableMouse(CanEditPublicNote()); PersonalNoteText:SetText(note); -- Update officer note if ( CanViewOfficerNote() ) then if ( CanEditOfficerNote() ) then if ( (not officernote) or (officernote == "") ) then officernote = GUILD_OFFICERNOTE_EDITLABEL; end OfficerNoteText:SetTextColor(1.0, 1.0, 1.0); else OfficerNoteText:SetTextColor(0.65, 0.65, 0.65); end GuildMemberOfficerNoteBackground:EnableMouse(CanEditOfficerNote()); OfficerNoteText:SetText(officernote); -- Resize detail frame GuildMemberDetailOfficerNoteLabel:Show(); GuildMemberOfficerNoteBackground:Show(); GuildMemberDetailFrame:SetHeight(GUILD_DETAIL_OFFICER_HEIGHT); else GuildMemberDetailOfficerNoteLabel:Hide(); GuildMemberOfficerNoteBackground:Hide(); GuildMemberDetailFrame:SetHeight(GUILD_DETAIL_NORM_HEIGHT); end -- Manage guild member related buttons if ( CanGuildPromote() and ( rankIndex > 1 ) and ( rankIndex > (guildRankIndex + 1) ) ) then GuildFramePromoteButton:Enable(); else GuildFramePromoteButton:Disable(); end if ( CanGuildDemote() and ( rankIndex >= 1 ) and ( rankIndex > guildRankIndex ) and ( rankIndex ~= maxRankIndex ) ) then GuildFrameDemoteButton:Enable(); else GuildFrameDemoteButton:Disable(); end -- Hide promote/demote buttons if both disabled if ( GuildFrameDemoteButton:IsEnabled() == 0 and GuildFramePromoteButton:IsEnabled() == 0 ) then GuildFramePromoteButton:Hide(); GuildFrameDemoteButton:Hide(); else GuildFramePromoteButton:Show(); GuildFrameDemoteButton:Show(); end if ( CanGuildRemove() and ( rankIndex >= 1 ) and ( rankIndex > guildRankIndex ) ) then GuildMemberRemoveButton:Enable(); else GuildMemberRemoveButton:Disable(); end if ( (UnitName("player") == name) or (not online) ) then GuildMemberGroupInviteButton:Disable(); else GuildMemberGroupInviteButton:Enable(); end GuildFrame.selectedName = GetGuildRosterInfo(GetGuildRosterSelection()); else GuildMemberDetailFrame:Hide(); end -- Message of the day stuff local guildMOTD = GetGuildRosterMOTD(); if ( CanEditMOTD() ) then if ( (not guildMOTD) or (guildMOTD == "") ) then guildMOTD = GUILD_MOTD_EDITLABEL; end GuildFrameNotesText:SetTextColor(1.0, 1.0, 1.0); GuildMOTDEditButton:Enable(); else GuildFrameNotesText:SetTextColor(0.65, 0.65, 0.65); GuildMOTDEditButton:Disable(); end GuildFrameNotesText:SetText(CURRENT_GUILD_MOTD); -- Scrollbar stuff local showScrollBar = nil; if ( numGuildMembers > GUILDMEMBERS_TO_DISPLAY ) then showScrollBar = 1; end -- Get number of online members for i=1, numGuildMembers, 1 do name, rank, rankIndex, level, class, zone, note, officernote, online = GetGuildRosterInfo(i); if ( online ) then onlinecount = onlinecount + 1; end if ( rankIndex == maxRankIndex ) then FriendsFrame.playersInBotRank = FriendsFrame.playersInBotRank + 1; end end GuildFrameTotals:SetFormattedText(GUILD_TOTAL, numGuildMembers); GuildFrameOnlineTotals:SetFormattedText(GUILD_TOTALONLINE, onlinecount); -- Update global guild frame buttons if ( IsGuildLeader() ) then GuildFrameControlButton:Enable(); else GuildFrameControlButton:Disable(); end if ( CanGuildInvite() ) then GuildFrameAddMemberButton:Enable(); else GuildFrameAddMemberButton:Disable(); end if ( FriendsFrame.playerStatusFrame ) then -- Player specific info local guildOffset = FauxScrollFrame_GetOffset(GuildListScrollFrame); for i=1, GUILDMEMBERS_TO_DISPLAY, 1 do guildIndex = guildOffset + i; button = _G["GuildFrameButton"..i]; button.guildIndex = guildIndex; name, rank, rankIndex, level, class, zone, note, officernote, online, status, classFileName = GetGuildRosterInfo(guildIndex); if ( not online ) then buttonText = _G["GuildFrameButton"..i.."Name"]; buttonText:SetText(name); buttonText:SetTextColor(0.5, 0.5, 0.5); buttonText = _G["GuildFrameButton"..i.."Zone"]; buttonText:SetText(zone); buttonText:SetTextColor(0.5, 0.5, 0.5); buttonText = _G["GuildFrameButton"..i.."Level"]; buttonText:SetText(level); buttonText:SetTextColor(0.5, 0.5, 0.5); buttonText = _G["GuildFrameButton"..i.."Class"]; buttonText:SetText(class); buttonText:SetTextColor(0.5, 0.5, 0.5); else if ( classFileName ) then classTextColor = RAID_CLASS_COLORS[classFileName]; else classTextColor = NORMAL_FONT_COLOR; end buttonText = _G["GuildFrameButton"..i.."Name"]; buttonText:SetText(name); buttonText:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); buttonText = _G["GuildFrameButton"..i.."Zone"]; buttonText:SetText(zone); buttonText:SetTextColor(1.0, 1.0, 1.0); buttonText = _G["GuildFrameButton"..i.."Level"]; buttonText:SetText(level); buttonText:SetTextColor(1.0, 1.0, 1.0); buttonText = _G["GuildFrameButton"..i.."Class"]; buttonText:SetText(class); buttonText:SetTextColor(classTextColor.r, classTextColor.g, classTextColor.b); end -- If need scrollbar resize columns if ( showScrollBar ) then _G["GuildFrameButton"..i.."Zone"]:SetWidth(95); else _G["GuildFrameButton"..i.."Zone"]:SetWidth(110); end -- Highlight the correct who if ( GetGuildRosterSelection() == guildIndex ) then button:LockHighlight(); else button:UnlockHighlight(); end if ( guildIndex > numGuildMembers ) then button:Hide(); else button:Show(); end end GuildFrameGuildListToggleButton:SetText(PLAYER_STATUS); -- If need scrollbar resize column headers if ( showScrollBar ) then WhoFrameColumn_SetWidth(GuildFrameColumnHeader2, 105); GuildFrameGuildListToggleButton:SetPoint("LEFT", "GuildFrame", "LEFT", 284, -67); else WhoFrameColumn_SetWidth(GuildFrameColumnHeader2, 120); GuildFrameGuildListToggleButton:SetPoint("LEFT", "GuildFrame", "LEFT", 307, -67); end -- ScrollFrame update FauxScrollFrame_Update(GuildListScrollFrame, numGuildMembers, GUILDMEMBERS_TO_DISPLAY, FRIENDS_FRAME_GUILD_HEIGHT ); GuildPlayerStatusFrame:Show(); GuildStatusFrame:Hide(); else -- Guild specific info local year, month, day, hour; local yearlabel, monthlabel, daylabel, hourlabel; local guildOffset = FauxScrollFrame_GetOffset(GuildListScrollFrame); local classFileName; for i=1, GUILDMEMBERS_TO_DISPLAY, 1 do guildIndex = guildOffset + i; button = _G["GuildFrameGuildStatusButton"..i]; button.guildIndex = guildIndex; name, rank, rankIndex, level, class, zone, note, officernote, online, status, classFileName = GetGuildRosterInfo(guildIndex); _G["GuildFrameGuildStatusButton"..i.."Name"]:SetText(name); _G["GuildFrameGuildStatusButton"..i.."Rank"]:SetText(rank); _G["GuildFrameGuildStatusButton"..i.."Note"]:SetText(note); if ( online ) then if ( status == "" ) then _G["GuildFrameGuildStatusButton"..i.."Online"]:SetText(GUILD_ONLINE_LABEL); else _G["GuildFrameGuildStatusButton"..i.."Online"]:SetText(status); end if ( classFileName ) then classTextColor = RAID_CLASS_COLORS[classFileName]; else classTextColor = NORMAL_FONT_COLOR; end _G["GuildFrameGuildStatusButton"..i.."Name"]:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); _G["GuildFrameGuildStatusButton"..i.."Rank"]:SetTextColor(1.0, 1.0, 1.0); _G["GuildFrameGuildStatusButton"..i.."Note"]:SetTextColor(1.0, 1.0, 1.0); _G["GuildFrameGuildStatusButton"..i.."Online"]:SetTextColor(classTextColor.r, classTextColor.g, classTextColor.b); else _G["GuildFrameGuildStatusButton"..i.."Online"]:SetText(GuildFrame_GetLastOnline(guildIndex)); _G["GuildFrameGuildStatusButton"..i.."Name"]:SetTextColor(0.5, 0.5, 0.5); _G["GuildFrameGuildStatusButton"..i.."Rank"]:SetTextColor(0.5, 0.5, 0.5); _G["GuildFrameGuildStatusButton"..i.."Note"]:SetTextColor(0.5, 0.5, 0.5); _G["GuildFrameGuildStatusButton"..i.."Online"]:SetTextColor(0.5, 0.5, 0.5); end -- If need scrollbar resize columns if ( showScrollBar ) then _G["GuildFrameGuildStatusButton"..i.."Note"]:SetWidth(70); else _G["GuildFrameGuildStatusButton"..i.."Note"]:SetWidth(85); end -- Highlight the correct who if ( GetGuildRosterSelection() == guildIndex ) then button:LockHighlight(); else button:UnlockHighlight(); end if ( guildIndex > numGuildMembers ) then button:Hide(); else button:Show(); end end GuildFrameGuildListToggleButton:SetText(GUILD_STATUS); -- If need scrollbar resize columns if ( showScrollBar ) then WhoFrameColumn_SetWidth(GuildFrameGuildStatusColumnHeader3, 75); GuildFrameGuildListToggleButton:SetPoint("LEFT", "GuildFrame", "LEFT", 284, -67); else WhoFrameColumn_SetWidth(GuildFrameGuildStatusColumnHeader3, 90); GuildFrameGuildListToggleButton:SetPoint("LEFT", "GuildFrame", "LEFT", 307, -67); end -- ScrollFrame update FauxScrollFrame_Update(GuildListScrollFrame, numGuildMembers, GUILDMEMBERS_TO_DISPLAY, FRIENDS_FRAME_GUILD_HEIGHT ); GuildPlayerStatusFrame:Hide(); GuildStatusFrame:Show(); end end function WhoFrameColumn_SetWidth(frame, width) frame:SetWidth(width); _G[frame:GetName().."Middle"]:SetWidth(width - 9); end function WhoFrameDropDown_Initialize() local info = UIDropDownMenu_CreateInfo(); for i=1, getn(WHOFRAME_DROPDOWN_LIST), 1 do info.text = WHOFRAME_DROPDOWN_LIST[i].name; info.func = WhoFrameDropDownButton_OnClick; info.checked = nil; UIDropDownMenu_AddButton(info); end end function WhoFrameDropDown_OnLoad(self) UIDropDownMenu_Initialize(self, WhoFrameDropDown_Initialize); UIDropDownMenu_SetWidth(self, 80); UIDropDownMenu_SetButtonWidth(self, 24); UIDropDownMenu_JustifyText(WhoFrameDropDown, "LEFT") end function WhoFrameDropDownButton_OnClick(self) UIDropDownMenu_SetSelectedID(WhoFrameDropDown, self:GetID()); WhoList_Update(); end function FriendsFrame_OnEvent(self, event, ...) if ( event == "FRIENDLIST_SHOW" ) then FriendsList_Update(); FriendsFrame_Update(); elseif ( event == "FRIENDLIST_UPDATE" or event == "PARTY_MEMBERS_CHANGED" ) then FriendsList_Update(); elseif ( event == "BN_FRIEND_LIST_SIZE_CHANGED" or event == "BN_FRIEND_INFO_CHANGED" ) then BNetBroadcasts, numOnlineBroadcasts, numOfflineBroadcasts = BNGetCustomMessageTable(BNetBroadcasts); if(not BNetBroadcasts) then BNetBroadcasts = { }; end FriendsList_Update(); elseif ( event == "BN_CUSTOM_MESSAGE_CHANGED" ) then local arg1 = ...; if ( arg1 ) then --There is no presenceID given if this is ourself. BNetBroadcasts, numOnlineBroadcasts, numOfflineBroadcasts = BNGetCustomMessageTable(BNetBroadcasts); if(not BNetBroadcasts) then BNetBroadcasts = { }; end FriendsList_Update(); else FriendsFrameBroadcastInput_UpdateDisplay(); end elseif ( event == "BN_CUSTOM_MESSAGE_LOADED" ) then FriendsFrameBroadcastInput_UpdateDisplay(); elseif ( event == "BN_FRIEND_INVITE_ADDED" ) then local arg1 = ...; if ( arg1 ) then PendingInvitesNew[arg1] = true; PendingList_Update(true); end elseif ( event == "BN_FRIEND_INVITE_LIST_INITIALIZED" ) then PendingInvitesNew["all"] = true; PendingList_Update(); elseif ( event == "BN_FRIEND_INVITE_REMOVED" ) then PendingList_Update(); elseif ( event == "IGNORELIST_UPDATE" or event == "MUTELIST_UPDATE" or event == "BN_BLOCK_LIST_UPDATED" ) then IgnoreList_Update(); elseif ( event == "WHO_LIST_UPDATE" ) then WhoList_Update(); FriendsFrame_Update(); elseif ( event == "GUILD_ROSTER_UPDATE" ) then GuildInfoFrame.cachedText = nil; if ( GuildFrame:IsShown() ) then local arg1 = ...; if ( arg1 ) then GuildRoster(); end GuildStatus_Update(); FriendsFrame_Update(); GuildControlPopupFrame_Initialize(); end elseif ( event == "PLAYER_GUILD_UPDATE" ) then if ( FriendsFrame:IsVisible() ) then InGuildCheck(); end if ( not IsInGuild() ) then GuildControlPopupFrame.initialized = false; end elseif ( event == "GUILD_MOTD") then CURRENT_GUILD_MOTD = ...; GuildFrameNotesText:SetText(CURRENT_GUILD_MOTD); elseif ( event == "VOICE_CHAT_ENABLED_UPDATE" ) then VoiceChat_Toggle(); elseif ( event == "PLAYER_FLAGS_CHANGED" ) then SynchronizeBNetStatus(); FriendsFrameStatusDropDown_Update(); elseif ( event == "PLAYER_ENTERING_WORLD" or event == "BN_CONNECTED" or event == "BN_DISCONNECTED" or event == "BN_SELF_ONLINE" ) then FriendsFrame_CheckBattlenetStatus(); end end function FriendsFrameFriendButton_OnClick(self, button) if ( button == "LeftButton" ) then PlaySound("igMainMenuOptionCheckBoxOn"); FriendsFrame_SelectFriend(self.buttonType, self.id); FriendsList_Update(); elseif ( button == "RightButton" ) then PlaySound("igMainMenuOptionCheckBoxOn"); if ( self.buttonType == FRIENDS_BUTTON_TYPE_BNET ) then -- bnet friend local presenceID, givenName, surname, toonName, toonID, client, isOnline = BNGetFriendInfo(self.id); FriendsFrame_ShowBNDropdown(format(BATTLENET_NAME_FORMAT, givenName, surname), isOnline, nil, nil, nil, 1, presenceID); else -- wow friend local name, level, class, area, connected = GetFriendInfo(self.id); FriendsFrame_ShowDropdown(name, connected, nil, nil, nil, 1); end end end function FriendsFrame_SelectFriend(friendType, id) if ( friendType == FRIENDS_BUTTON_TYPE_WOW ) then SetSelectedFriend(id); elseif ( friendType == FRIENDS_BUTTON_TYPE_BNET ) then BNSetSelectedFriend(id); end FriendsFrame.selectedFriendType = friendType; end function FriendsFrame_SelectSquelched(ignoreType, index) if ( ignoreType == SQUELCH_TYPE_IGNORE ) then SetSelectedIgnore(index); elseif ( ignoreType == SQUELCH_TYPE_BLOCK_INVITE ) then BNSetSelectedBlock(index); elseif ( ignoreType == SQUELCH_TYPE_BLOCK_TOON ) then BNSetSelectedToonBlock(index); elseif ( ignoreType == SQUELCH_TYPE_MUTE ) then SetSelectedMute(index); end FriendsFrame.selectedSquelchType = ignoreType; end function FriendsFrameAddFriendButton_OnClick(self) if ( UnitIsPlayer("target") and UnitCanCooperate("player", "target") and not GetFriendInfo(UnitName("target")) ) then local name, server = UnitName("target"); if ( server and (not UnitIsSameServer("player", "target")) ) then name = name.."-"..server; end AddFriend(name); PlaySound("UChatScrollButton"); else if ( BNFeaturesEnabled() ) then AddFriendEntryFrame_Collapse(true); AddFriendFrame.editFocus = AddFriendNameEditBox; StaticPopupSpecial_Show(AddFriendFrame); if ( GetCVarBool("addFriendInfoShown") ) then AddFriendFrame_ShowEntry(); else AddFriendFrame_ShowInfo(); end else StaticPopup_Show("ADD_FRIEND"); end end end function FriendsFrameSendMessageButton_OnClick(self) local name; if ( FriendsFrame.selectedFriendType == FRIENDS_BUTTON_TYPE_WOW ) then name = GetFriendInfo(FriendsFrame.selectedFriend); elseif ( FriendsFrame.selectedFriendType == FRIENDS_BUTTON_TYPE_BNET ) then local presenceID, givenName, surname = BNGetFriendInfo(FriendsFrame.selectedFriend); name = string.format(BATTLENET_NAME_FORMAT, givenName, surname); end if ( name ) then PlaySound("igMainMenuOptionCheckBoxOn"); ChatFrame_SendTell(name); end end function FriendsFrameMuteButton_OnClick(self) SetSelectedMute(self:GetID()); MutedList_Update(); end function FriendsFrameUnsquelchButton_OnClick(self) local selectedSquelchType = FriendsFrame.selectedSquelchType; if ( selectedSquelchType == SQUELCH_TYPE_IGNORE ) then local name = GetIgnoreName(GetSelectedIgnore()); DelIgnore(name); elseif ( selectedSquelchType == SQUELCH_TYPE_BLOCK_INVITE ) then local blockID = BNGetBlockedInfo(BNGetSelectedBlock()); BNSetBlocked(blockID, false); elseif ( selectedSquelchType == SQUELCH_TYPE_BLOCK_TOON ) then local blockID = BNGetBlockedToonInfo(BNGetSelectedToonBlock()); BNSetToonBlocked(blockID, false); elseif ( selectedSquelchType == SQUELCH_TYPE_MUTE ) then local name = GetMuteName(GetSelectedMute()); DelMute(name); end PlaySound("igMainMenuOptionCheckBoxOn"); end function FriendsFrameWhoButton_OnClick(self, button) if ( button == "LeftButton" ) then WhoFrame.selectedWho = _G["WhoFrameButton"..self:GetID()].whoIndex; WhoFrame.selectedName = _G["WhoFrameButton"..self:GetID().."Name"]:GetText(); WhoList_Update(); else local name = _G["WhoFrameButton"..self:GetID().."Name"]:GetText(); FriendsFrame_ShowDropdown(name, 1); end end function FriendsFrameGuildStatusButton_OnClick(self, button) if ( button == "LeftButton" ) then GuildFrame.previousSelectedGuildMember = GuildFrame.selectedGuildMember; GuildFrame.selectedGuildMember = self.guildIndex; GuildFrame.selectedName = _G[self:GetName().."Name"]:GetText(); SetGuildRosterSelection(GuildFrame.selectedGuildMember); -- Toggle guild details frame if ( GuildMemberDetailFrame:IsShown() and (GuildFrame.previousSelectedGuildMember and (GuildFrame.previousSelectedGuildMember == GuildFrame.selectedGuildMember)) ) then GuildMemberDetailFrame:Hide(); GuildFrame.selectedGuildMember = 0; SetGuildRosterSelection(0); else GuildFramePopup_Show(GuildMemberDetailFrame); end GuildStatus_Update(); else local guildIndex = self.guildIndex; local name, rank, rankIndex, level, class, zone, note, officernote, online = GetGuildRosterInfo(guildIndex); FriendsFrame_ShowDropdown(name, online); end end function FriendsFrame_UnIgnore(button, name) DelIgnore(name); end function FriendsFrame_UnMute(button, name) DelMute(name); end function FriendsFrame_UnBlock(button, blockID) BNSetBlocked(blockID, false); end function FriendsFrame_RemoveFriend() if ( FriendsFrame.selectedFriend ) then RemoveFriend(FriendsFrame.selectedFriend); PlaySound("UChatScrollButton"); end end function FriendsFrame_SendMessage() local name = GetFriendInfo(FriendsFrame.selectedFriend); ChatFrame_SendTell(name); PlaySound("UChatScrollButton"); end function FriendsFrame_GroupInvite() local name = GetFriendInfo(FriendsFrame.selectedFriend); InviteUnit(name); PlaySound("UChatScrollButton"); end function ToggleFriendsFrame(tab) if ( not tab ) then if ( FriendsFrame:IsShown() ) then HideUIPanel(FriendsFrame); else ShowUIPanel(FriendsFrame); end else -- If not in a guild don't do anything when they try to toggle the guild tab if ( tab == 3 and not IsInGuild() ) then return; end if ( tab == PanelTemplates_GetSelectedTab(FriendsFrame) and FriendsFrame:IsShown() ) then HideUIPanel(FriendsFrame); return; end PanelTemplates_SetTab(FriendsFrame, tab); if ( FriendsFrame:IsShown() ) then FriendsFrame_OnShow(); else ShowUIPanel(FriendsFrame); end end end function WhoFrameEditBox_OnEnterPressed(self) SendWho(self:GetText()); self:ClearFocus(); end function ToggleFriendsPanel() local friendsTabShown = FriendsFrame:IsShown() and PanelTemplates_GetSelectedTab(FriendsFrame) == 1 and FriendsTabHeader.selectedTab == 1; if ( friendsTabShown ) then HideUIPanel(FriendsFrame); else PanelTemplates_SetTab(FriendsFrame, 1); PanelTemplates_SetTab(FriendsTabHeader, 1); ShowUIPanel(FriendsFrame); end end function ShowWhoPanel() PanelTemplates_SetTab(FriendsFrame, 2); if ( FriendsFrame:IsShown() ) then FriendsFrame_OnShow(); else ShowUIPanel(FriendsFrame); end end function ToggleIgnorePanel() local ignoreTabShown = FriendsFrame:IsShown() and PanelTemplates_GetSelectedTab(FriendsFrame) == 1 and FriendsTabHeader.selectedTab == 2; if ( ignoreTabShown ) then HideUIPanel(FriendsFrame); else PanelTemplates_SetTab(FriendsFrame, 1); PanelTemplates_SetTab(FriendsTabHeader, 2); FriendsFrame_Update(); ShowUIPanel(FriendsFrame); end end function WhoFrame_GetDefaultWhoCommand() local level = UnitLevel("player"); local minLevel = level-3; if ( minLevel <= 0 ) then minLevel = 1; end local command = WHO_TAG_ZONE.."\""..GetRealZoneText().."\" "..minLevel.."-"..(level+3); return command; end function GuildControlPopupFrame_OnLoad() local buttonText; for i=1, 17 do buttonText = _G["GuildControlPopupFrameCheckbox"..i.."Text"]; if ( buttonText ) then buttonText:SetText(_G["GUILDCONTROL_OPTION"..i]); end end GuildControlTabPermissionsViewTabText:SetText(GUILDCONTROL_VIEW_TAB); GuildControlTabPermissionsDepositItemsText:SetText(GUILDCONTROL_DEPOSIT_ITEMS); GuildControlTabPermissionsUpdateTextText:SetText(GUILDCONTROL_UPDATE_TEXT); ClearPendingGuildBankPermissions(); end --Need to call this function on an event since the guildroster is not available during OnLoad() function GuildControlPopupFrame_Initialize() if ( GuildControlPopupFrame.initialized ) then return; end UIDropDownMenu_Initialize(GuildControlPopupFrameDropDown, GuildControlPopupFrameDropDown_Initialize); GuildControlSetRank(1); UIDropDownMenu_SetSelectedID(GuildControlPopupFrameDropDown, 1); UIDropDownMenu_SetText(GuildControlPopupFrameDropDown, GuildControlGetRankName(1)); -- Select tab 1 GuildBankTabPermissionsTab_OnClick(1); GuildControlPopupFrame:SetScript("OnEvent", GuildControlPopupFrame_OnEvent); GuildControlPopupFrame.initialized = 1; GuildControlPopupFrame.rank = GuildControlGetRankName(1); end function GuildControlPopupFrame_OnShow() FriendsFrame:SetAttribute("UIPanelLayout-defined", nil); FriendsFrame.guildControlShow = 1; GuildControlPopupAcceptButton:Disable(); -- Update popup GuildControlPopupframe_Update(); UIPanelWindows["FriendsFrame"].width = FriendsFrame:GetWidth() + GuildControlPopupFrame:GetWidth(); UpdateUIPanelPositions(FriendsFrame); --GuildControlPopupFrame:RegisterEvent("GUILD_ROSTER_UPDATE"); --It was decided that having a risk of conflict when two people are editing the guild permissions at once is better than resetting whenever someone joins the guild or changes ranks. end function GuildControlPopupFrame_OnEvent (self, event, ...) if ( not IsGuildLeader(UnitName("player")) ) then GuildControlPopupFrame:Hide(); return; end local rank for i = 1, GuildControlGetNumRanks() do rank = GuildControlGetRankName(i); if ( GuildControlPopupFrame.rank and rank == GuildControlPopupFrame.rank ) then UIDropDownMenu_SetSelectedID(GuildControlPopupFrameDropDown, i); UIDropDownMenu_SetText(GuildControlPopupFrameDropDown, rank); end end GuildControlPopupframe_Update() end function GuildControlPopupFrame_OnHide() FriendsFrame:SetAttribute("UIPanelLayout-defined", nil); FriendsFrame.guildControlShow = 0; UIPanelWindows["FriendsFrame"].width = FriendsFrame:GetWidth(); UpdateUIPanelPositions(); GuildControlPopupFrame.goldChanged = nil; GuildControlPopupFrame:UnregisterEvent("GUILD_ROSTER_UPDATE"); end function GuildControlPopupframe_Update(loadPendingTabPermissions, skipCheckboxUpdate) -- Skip non-tab specific updates to fix Bug ID: 110210 if ( not skipCheckboxUpdate ) then -- Update permission flags GuildControlCheckboxUpdate(GuildControlGetRankFlags()); end local rankID = UIDropDownMenu_GetSelectedID(GuildControlPopupFrameDropDown); GuildControlPopupFrameEditBox:SetText(GuildControlGetRankName(rankID)); if ( GuildControlPopupFrame.previousSelectedRank and GuildControlPopupFrame.previousSelectedRank ~= rankID ) then ClearPendingGuildBankPermissions(); end GuildControlPopupFrame.previousSelectedRank = rankID; --If rank to modify is guild master then gray everything out if ( IsGuildLeader() and rankID == 1 ) then GuildBankTabLabel:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); GuildControlTabPermissionsDepositItems:SetChecked(1); GuildControlTabPermissionsViewTab:SetChecked(1); GuildControlTabPermissionsUpdateText:SetChecked(1); BlizzardOptionsPanel_CheckButton_Disable(GuildControlTabPermissionsDepositItems); BlizzardOptionsPanel_CheckButton_Disable(GuildControlTabPermissionsViewTab); BlizzardOptionsPanel_CheckButton_Disable(GuildControlTabPermissionsUpdateText); GuildControlTabPermissionsWithdrawItemsText:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); GuildControlWithdrawItemsEditBox:SetNumeric(nil); GuildControlWithdrawItemsEditBox:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); GuildControlWithdrawItemsEditBox:SetText(UNLIMITED); GuildControlWithdrawItemsEditBox:ClearFocus(); GuildControlWithdrawItemsEditBoxMask:Show(); GuildControlWithdrawGoldText:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); GuildControlWithdrawGoldAmountText:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); GuildControlWithdrawGoldEditBox:SetNumeric(nil); GuildControlWithdrawGoldEditBox:SetMaxLetters(0); GuildControlWithdrawGoldEditBox:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); GuildControlWithdrawGoldEditBox:SetText(UNLIMITED); GuildControlWithdrawGoldEditBox:ClearFocus(); GuildControlWithdrawGoldEditBoxMask:Show(); BlizzardOptionsPanel_CheckButton_Disable(GuildControlPopupFrameCheckbox15); BlizzardOptionsPanel_CheckButton_Disable(GuildControlPopupFrameCheckbox16); else if ( GetNumGuildBankTabs() == 0 ) then -- No tabs, no permissions! Disable the tab related doohickies GuildBankTabLabel:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); BlizzardOptionsPanel_CheckButton_Disable(GuildControlTabPermissionsViewTab); BlizzardOptionsPanel_CheckButton_Disable(GuildControlTabPermissionsDepositItems); BlizzardOptionsPanel_CheckButton_Disable(GuildControlTabPermissionsUpdateText); GuildControlTabPermissionsWithdrawItemsText:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); GuildControlWithdrawItemsEditBox:SetText(UNLIMITED); GuildControlWithdrawItemsEditBox:ClearFocus(); GuildControlWithdrawItemsEditBoxMask:Show(); else GuildBankTabLabel:SetVertexColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); BlizzardOptionsPanel_CheckButton_Enable(GuildControlTabPermissionsViewTab); GuildControlTabPermissionsWithdrawItemsText:SetVertexColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); GuildControlWithdrawItemsEditBox:SetNumeric(1); GuildControlWithdrawItemsEditBox:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); GuildControlWithdrawItemsEditBoxMask:Hide(); end GuildControlWithdrawGoldText:SetVertexColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); GuildControlWithdrawGoldAmountText:SetVertexColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); GuildControlWithdrawGoldEditBox:SetNumeric(1); GuildControlWithdrawGoldEditBox:SetMaxLetters(MAX_GOLD_WITHDRAW_DIGITS); GuildControlWithdrawGoldEditBox:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); GuildControlWithdrawGoldEditBoxMask:Hide(); BlizzardOptionsPanel_CheckButton_Enable(GuildControlPopupFrameCheckbox15); BlizzardOptionsPanel_CheckButton_Enable(GuildControlPopupFrameCheckbox16); -- Update tab specific info local viewTab, canDeposit, canUpdateText, numWithdrawals = GetGuildBankTabPermissions(GuildControlPopupFrameTabPermissions.selectedTab); if ( rankID == 1 ) then --If is guildmaster then force checkboxes to be selected viewTab = 1; canDeposit = 1; canUpdateText = 1; elseif ( loadPendingTabPermissions ) then local permissions = PENDING_GUILDBANK_PERMISSIONS[GuildControlPopupFrameTabPermissions.selectedTab]; local value; value = permissions[GuildControlTabPermissionsViewTab:GetID()]; if ( value ) then viewTab = value; end value = permissions[GuildControlTabPermissionsDepositItems:GetID()]; if ( value ) then canDeposit = value; end value = permissions[GuildControlTabPermissionsUpdateText:GetID()]; if ( value ) then canUpdateText = value; end value = permissions["withdraw"]; if ( value ) then numWithdrawals = value; end end GuildControlTabPermissionsViewTab:SetChecked(viewTab); GuildControlTabPermissionsDepositItems:SetChecked(canDeposit); GuildControlTabPermissionsUpdateText:SetChecked(canUpdateText); GuildControlWithdrawItemsEditBox:SetText(numWithdrawals); local goldWithdrawLimit = GetGuildBankWithdrawLimit(); -- Only write to the editbox if the value hasn't been changed by the player if ( not GuildControlPopupFrame.goldChanged ) then if ( goldWithdrawLimit >= 0 ) then GuildControlWithdrawGoldEditBox:SetText(goldWithdrawLimit); else -- This is for the guild leader who defaults to -1 GuildControlWithdrawGoldEditBox:SetText(MAX_GOLD_WITHDRAW); end end GuildControlPopup_UpdateDepositCheckBox(); end --Only show available tabs local tab; local numTabs = GetNumGuildBankTabs(); local name, permissionsTabBackground, permissionsText; for i=1, MAX_GUILDBANK_TABS do name = GetGuildBankTabInfo(i); tab = _G["GuildBankTabPermissionsTab"..i]; if ( i <= numTabs ) then tab:Show(); tab.tooltip = name; permissionsTabBackground = _G["GuildBankTabPermissionsTab"..i.."Background"]; permissionsText = _G["GuildBankTabPermissionsTab"..i.."Text"]; if ( GuildControlPopupFrameTabPermissions.selectedTab == i ) then tab:LockHighlight(); permissionsTabBackground:SetTexCoord(0, 1.0, 0, 1.0); permissionsTabBackground:SetHeight(32); permissionsText:SetPoint("CENTER", permissionsTabBackground, "CENTER", 0, -3); else tab:UnlockHighlight(); permissionsTabBackground:SetTexCoord(0, 1.0, 0, 0.875); permissionsTabBackground:SetHeight(28); permissionsText:SetPoint("CENTER", permissionsTabBackground, "CENTER", 0, -5); end if ( IsGuildLeader() and rankID == 1 ) then tab:Disable(); else tab:Enable(); end else tab:Hide(); end end end function WithdrawGoldEditBox_Update() if ( not GuildControlPopupFrameCheckbox15:GetChecked() and not GuildControlPopupFrameCheckbox16:GetChecked() ) then GuildControlWithdrawGoldAmountText:SetVertexColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); GuildControlWithdrawGoldEditBox:SetTextColor(GRAY_FONT_COLOR.r, GRAY_FONT_COLOR.g, GRAY_FONT_COLOR.b); GuildControlWithdrawGoldEditBox:ClearFocus(); GuildControlWithdrawGoldEditBoxMask:Show(); else GuildControlWithdrawGoldAmountText:SetVertexColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); GuildControlWithdrawGoldEditBox:SetTextColor(HIGHLIGHT_FONT_COLOR.r, HIGHLIGHT_FONT_COLOR.g, HIGHLIGHT_FONT_COLOR.b); GuildControlWithdrawGoldEditBoxMask:Hide(); end end function GuildControlPopupAcceptButton_OnClick() local amount = GuildControlWithdrawGoldEditBox:GetText(); if(amount and amount ~= "" and amount ~= UNLIMITED and tonumber(amount) and tonumber(amount) > 0) then SetGuildBankWithdrawLimit(amount); else SetGuildBankWithdrawLimit(0); end SavePendingGuildBankTabPermissions() GuildControlSaveRank(GuildControlPopupFrameEditBox:GetText()); GuildStatus_Update(); GuildControlPopupAcceptButton:Disable(); UIDropDownMenu_SetText(GuildControlPopupFrameDropDown, GuildControlPopupFrameEditBox:GetText()); GuildControlPopupFrame:Hide(); ClearPendingGuildBankPermissions(); end function GuildControlPopupFrameDropDown_OnLoad(self) UIDropDownMenu_SetWidth(self, 160); UIDropDownMenu_SetButtonWidth(self, 54); UIDropDownMenu_JustifyText(GuildControlPopupFrameDropDown, "LEFT"); end function GuildControlPopupFrameDropDown_Initialize() local info = UIDropDownMenu_CreateInfo(); for i=1, GuildControlGetNumRanks() do info.text = GuildControlGetRankName(i); info.func = GuildControlPopupFrameDropDownButton_OnClick; info.checked = nil; UIDropDownMenu_AddButton(info); end end function GuildControlPopupFrameDropDownButton_OnClick(self) local rank = self:GetID(); UIDropDownMenu_SetSelectedID(GuildControlPopupFrameDropDown, rank); GuildControlSetRank(rank); GuildControlPopupFrame.rank = GuildControlGetRankName(rank); GuildControlPopupFrame.goldChanged = nil; GuildControlPopupframe_Update(); GuildControlPopupFrameAddRankButton_OnUpdate(GuildControlPopupFrameAddRankButton); GuildControlPopupFrameRemoveRankButton_OnUpdate(GuildControlPopupFrameRemoveRankButton); GuildControlPopupAcceptButton:Disable(); end function GuildControlCheckboxUpdate(...) local checkbox; for i=1, select("#", ...), 1 do checkbox = _G["GuildControlPopupFrameCheckbox"..i] if ( checkbox ) then checkbox:SetChecked(select(i, ...)); else --We need to skip checkbox 14 since it's a deprecated flag --message("GuildControlPopupFrameCheckbox"..i.." does not exist!"); end end end function GuildControlPopupFrameAddRankButton_OnUpdate(self) if ( GuildControlGetNumRanks() >= 10 ) then self:Disable(); else self:Enable(); end end function GuildControlPopupFrameRemoveRankButton_OnClick() GuildControlDelRank(GuildControlGetRankName(UIDropDownMenu_GetSelectedID(GuildControlPopupFrameDropDown))); GuildControlPopupFrame.rank = GuildControlGetRankName(1); GuildControlSetRank(1); GuildStatus_Update(); UIDropDownMenu_SetSelectedID(GuildControlPopupFrameDropDown, 1); GuildControlPopupFrameEditBox:SetText(GuildControlGetRankName(1)); GuildControlCheckboxUpdate(GuildControlGetRankFlags()); CloseDropDownMenus(); -- Set this to call guildroster in the next frame --GuildRoster(); --GuildControlPopupFrame.update = 1; end function GuildControlPopupFrameRemoveRankButton_OnUpdate(self) local numRanks = GuildControlGetNumRanks() if ( (UIDropDownMenu_GetSelectedID(GuildControlPopupFrameDropDown) == numRanks) and (numRanks > 5) ) then self:Show(); if ( FriendsFrame.playersInBotRank > 0 ) then self:Disable(); else self:Enable(); end else self:Hide(); end end function GuildControlPopup_UpdateDepositCheckBox() if(GuildControlTabPermissionsViewTab:GetChecked()) then BlizzardOptionsPanel_CheckButton_Enable(GuildControlTabPermissionsDepositItems); BlizzardOptionsPanel_CheckButton_Enable(GuildControlTabPermissionsUpdateText); else BlizzardOptionsPanel_CheckButton_Disable(GuildControlTabPermissionsDepositItems); BlizzardOptionsPanel_CheckButton_Disable(GuildControlTabPermissionsUpdateText); end end function InGuildCheck() if ( not IsInGuild() ) then PanelTemplates_DisableTab( FriendsFrame, 3 ); if ( FriendsFrame.selectedTab == 3 ) then FriendsFrame.selectedTab = 1; FriendsFrame_Update(); end else PanelTemplates_EnableTab( FriendsFrame, 3 ); FriendsFrame_Update(); end end function GuildFrameGuildListToggleButton_OnClick() if ( FriendsFrame.playerStatusFrame ) then FriendsFrame.playerStatusFrame = nil; else FriendsFrame.playerStatusFrame = 1; end GuildStatus_Update(); end function GuildFrameControlButton_OnUpdate() if ( FriendsFrame.guildControlShow == 1 ) then GuildFrameControlButton:LockHighlight(); else GuildFrameControlButton:UnlockHighlight(); end -- Janky way to make sure a change made to the guildroster will reflect in the guildroster call if ( GuildControlPopupFrame.update == 1 ) then GuildControlPopupFrame.update = 2; elseif ( GuildControlPopupFrame.update == 2 ) then GuildRoster(); GuildControlPopupFrame.update = nil; end end function GuildFrame_GetLastOnline(guildIndex) return RecentTimeDate( GetGuildRosterLastOnline(guildIndex) ); end function FriendsFrame_GetLastOnline(lastOnline) local year, month, day, hour, minute; local timeDifference = time() - lastOnline; local ONE_MINUTE = 60; local ONE_HOUR = 60 * ONE_MINUTE; local ONE_DAY = 24 * ONE_HOUR; local ONE_MONTH = 30 * ONE_DAY; local ONE_YEAR = 12 * ONE_MONTH; -- local ONE_MILLENIUM = 1000 * ONE_YEAR; for the future if ( timeDifference < ONE_MINUTE ) then return LASTONLINE_SECS; elseif ( timeDifference >= ONE_MINUTE and timeDifference < ONE_HOUR ) then return format(LASTONLINE_MINUTES, floor(timeDifference / ONE_MINUTE)); elseif ( timeDifference >= ONE_HOUR and timeDifference < ONE_DAY ) then return format(LASTONLINE_HOURS, floor(timeDifference / ONE_HOUR)); elseif ( timeDifference >= ONE_DAY and timeDifference < ONE_MONTH ) then return format(LASTONLINE_DAYS, floor(timeDifference / ONE_DAY)); elseif ( timeDifference >= ONE_MONTH and timeDifference < ONE_YEAR ) then return format(LASTONLINE_MONTHS, floor(timeDifference / ONE_MONTH)); else return format(LASTONLINE_YEARS, floor(timeDifference / ONE_YEAR)); end end function ToggleGuildInfoFrame() if ( GuildInfoFrame:IsShown() ) then GuildInfoFrame:Hide(); else GuildFramePopup_Show(GuildInfoFrame); end end function GuildBankTabPermissionsTab_OnClick(tab) GuildControlPopupFrameTabPermissions.selectedTab = tab; GuildControlPopupframe_Update(true, true); end -- Functions to allow canceling function ClearPendingGuildBankPermissions() for i=1, MAX_GUILDBANK_TABS do PENDING_GUILDBANK_PERMISSIONS[i] = {}; end end function SetPendingGuildBankTabPermissions(tab, id, checked) if ( not checked ) then checked = 0; end PENDING_GUILDBANK_PERMISSIONS[tab][id] = checked; end function SetPendingGuildBankTabWithdraw(tab, amount) PENDING_GUILDBANK_PERMISSIONS[tab]["withdraw"] = amount; end function SavePendingGuildBankTabPermissions() for index, value in pairs(PENDING_GUILDBANK_PERMISSIONS) do for i=1, 3 do if ( value[i] ) then SetGuildBankTabPermissions(index, i, value[i]); end end if ( value["withdraw"] ) then SetGuildBankTabWithdraw(index, value["withdraw"]); end end end -- Guild event log functions function ToggleGuildEventLog() if ( GuildEventLogFrame:IsShown() ) then GuildEventLogFrame:Hide(); else GuildFramePopup_Show(GuildEventLogFrame); -- QueryGuildEventLog(); end end function GuildEventLog_Update() local numEvents = GetNumGuildEvents(); local type, player1, player2, rank, year, month, day, hour; local msg; local buffer = ""; local max = GuildEventMessage:GetFieldSize() local length = 0; for i=numEvents, 1, -1 do type, player1, player2, rank, year, month, day, hour = GetGuildEventInfo(i); if ( not player1 ) then player1 = UNKNOWN; end if ( not player2 ) then player2 = UNKNOWN; end if ( type == "invite" ) then msg = format(GUILDEVENT_TYPE_INVITE, player1, player2); elseif ( type == "join" ) then msg = format(GUILDEVENT_TYPE_JOIN, player1); elseif ( type == "promote" ) then msg = format(GUILDEVENT_TYPE_PROMOTE, player1, player2, rank); elseif ( type == "demote" ) then msg = format(GUILDEVENT_TYPE_DEMOTE, player1, player2, rank); elseif ( type == "remove" ) then msg = format(GUILDEVENT_TYPE_REMOVE, player1, player2); elseif ( type == "quit" ) then msg = format(GUILDEVENT_TYPE_QUIT, player1); end if ( msg ) then msg = msg.."|cff009999 "..format(GUILD_BANK_LOG_TIME, RecentTimeDate(year, month, day, hour)).."|r|n"; length = length + msg:len(); if(length>max) then i=0 else buffer = buffer..msg end end end GuildEventMessage:SetText(buffer); end GUILDFRAME_POPUPS = { "GuildEventLogFrame", "GuildInfoFrame", "GuildMemberDetailFrame", "GuildControlPopupFrame", }; function GuildFramePopup_Show(frame) local name = frame:GetName(); for index, value in ipairs(GUILDFRAME_POPUPS) do if ( name ~= value ) then _G[value]:Hide(); end end frame:Show(); end function GuildFramePopup_HideAll() for index, value in ipairs(GUILDFRAME_POPUPS) do _G[value]:Hide(); end end -- Battle.net stuff starts here function FriendsFrame_CheckBattlenetStatus() if ( BNFeaturesEnabled() ) then if ( BNConnected() ) then BNetBroadcasts, numOnlineBroadcasts, numOfflineBroadcasts = BNGetCustomMessageTable(BNetBroadcasts); if(not BNetBroadcasts) then BNetBroadcasts = { }; end playerRealmName = GetRealmName(); playerFactionGroup = UnitFactionGroup("player"); FriendsFrameBattlenetStatus:Hide(); FriendsFrameStatusDropDown:Show(); FriendsFrameBroadcastInput:Show(); FriendsFrameBroadcastInput_UpdateDisplay(); else numOnlineBroadcasts = 0; numOfflineBroadcasts = 0; FriendsFrameBattlenetStatus:Show(); FriendsFrameStatusDropDown:Hide(); FriendsFrameBroadcastInput:Hide(); FriendsFrameOfflineHeader:Hide(); end if ( FriendsFrame:IsShown() ) then IgnoreList_Update(); PendingList_Update(); end -- has its own check if it is being shown, after it updates the count on the FriendsMicroButton FriendsList_Update(); end end function FriendsFrame_GetTopButton(offset) local heightLeft = offset; local priorHeight = 0; local buttonHeight; local numBNetTotal, numBNetOnline = BNGetNumFriends(); local numBNetOffline = numBNetTotal - numBNetOnline; local numWoWTotal, numWoWOnline = GetNumFriends(); local numWoWOffline = numWoWTotal - numWoWOnline; local buttonIndex = 0; -- online if ( numBNetOnline + numWoWOnline > 0 ) then local totalBNOnlineHeight = numBNetOnline * FRIENDS_BUTTON_NORMAL_HEIGHT + numOnlineBroadcasts * (FRIENDS_BUTTON_LARGE_HEIGHT - FRIENDS_BUTTON_NORMAL_HEIGHT); if ( heightLeft < totalBNOnlineHeight ) then for i = 1, numBNetOnline do if ( BNetBroadcasts[i] ) then buttonHeight = FRIENDS_BUTTON_LARGE_HEIGHT; else buttonHeight = FRIENDS_BUTTON_NORMAL_HEIGHT; end if ( (heightLeft - buttonHeight) < 1 ) then return i + buttonIndex, offset - heightLeft, totalScrollHeight; else heightLeft = heightLeft - buttonHeight; end end end heightLeft = heightLeft - totalBNOnlineHeight; buttonIndex = buttonIndex + numBNetOnline; if ( heightLeft < numWoWOnline * FRIENDS_BUTTON_NORMAL_HEIGHT ) then local index = math.floor(heightLeft / FRIENDS_BUTTON_NORMAL_HEIGHT) + 1; return buttonIndex + index, offset - heightLeft + (index - 1) * FRIENDS_BUTTON_NORMAL_HEIGHT, totalScrollHeight; end heightLeft = heightLeft - numWoWOnline * FRIENDS_BUTTON_NORMAL_HEIGHT; buttonIndex = buttonIndex + numWoWOnline; end -- offline if ( numBNetOffline + numWoWOffline > 0 ) then -- check header first if ( numBNetOnline + numWoWOnline > 0 ) then buttonIndex = buttonIndex + 1; if ( heightLeft < FRIENDS_BUTTON_HEADER_HEIGHT ) then return buttonIndex, offset - heightLeft, totalScrollHeight; else heightLeft = heightLeft - FRIENDS_BUTTON_HEADER_HEIGHT; end end local totalBNOfflineHeight = numBNetOffline * FRIENDS_BUTTON_NORMAL_HEIGHT + numOfflineBroadcasts * (FRIENDS_BUTTON_LARGE_HEIGHT - FRIENDS_BUTTON_NORMAL_HEIGHT); if ( heightLeft < totalBNOfflineHeight ) then for i = 1, numBNetOffline do if ( BNetBroadcasts[numBNetOnline + i] ) then buttonHeight = FRIENDS_BUTTON_LARGE_HEIGHT; else buttonHeight = FRIENDS_BUTTON_NORMAL_HEIGHT; end if ( (heightLeft - buttonHeight) < 1 ) then return i + buttonIndex, offset - heightLeft, totalScrollHeight; else heightLeft = heightLeft - buttonHeight; end end end heightLeft = heightLeft - totalBNOfflineHeight; buttonIndex = buttonIndex + numBNetOffline; if ( heightLeft < numWoWOffline * FRIENDS_BUTTON_NORMAL_HEIGHT ) then local index = math.floor(heightLeft / FRIENDS_BUTTON_NORMAL_HEIGHT) + 1; return buttonIndex + index, offset - heightLeft + (index - 1) * FRIENDS_BUTTON_NORMAL_HEIGHT, totalScrollHeight; end end end function FriendsFrame_SetButton(button, index, firstButton) local height; local nameText, nameColor, infoText, broadcastText; if ( firstButton ) then FriendsFrameOfflineHeader:Hide(); DynamicScrollFrame_UnlockAllHighlights(FriendsFrameFriendsScrollFrame); end button.buttonType = FriendButtons[index].buttonType; button.id = FriendButtons[index].id; if ( FriendButtons[index].buttonType == FRIENDS_BUTTON_TYPE_WOW ) then local name, level, class, area, connected, status, note = GetFriendInfo(FriendButtons[index].id); if ( connected ) then button.background:SetTexture(FRIENDS_WOW_BACKGROUND_COLOR.r, FRIENDS_WOW_BACKGROUND_COLOR.g, FRIENDS_WOW_BACKGROUND_COLOR.b, FRIENDS_WOW_BACKGROUND_COLOR.a); if ( status == "" ) then button.status:SetTexture(FRIENDS_TEXTURE_ONLINE); elseif ( status == CHAT_FLAG_AFK ) then button.status:SetTexture(FRIENDS_TEXTURE_AFK); elseif ( status == CHAT_FLAG_DND ) then button.status:SetTexture(FRIENDS_TEXTURE_DND); end nameText = name..", "..format(FRIENDS_LEVEL_TEMPLATE, level, class); nameColor = FRIENDS_WOW_NAME_COLOR; else button.background:SetTexture(FRIENDS_OFFLINE_BACKGROUND_COLOR.r, FRIENDS_OFFLINE_BACKGROUND_COLOR.g, FRIENDS_OFFLINE_BACKGROUND_COLOR.b, FRIENDS_OFFLINE_BACKGROUND_COLOR.a); button.status:SetTexture(FRIENDS_TEXTURE_OFFLINE); nameText = name; nameColor = FRIENDS_GRAY_COLOR; end infoText = area; button.gameIcon:Hide(); FriendsFrame_SummonButton_Update(button.summonButton); elseif ( FriendButtons[index].buttonType == FRIENDS_BUTTON_TYPE_BNET ) then local presenceID, givenName, surname, toonName, toonID, client, isOnline, lastOnline, isAFK, isDND, messageText, noteText = BNGetFriendInfo(FriendButtons[index].id); broadcastText = messageText; if ( isOnline ) then local _, _, _, _, _, _, _, _, zoneName, _, gameText = BNGetToonInfo(toonID); button.background:SetTexture(FRIENDS_BNET_BACKGROUND_COLOR.r, FRIENDS_BNET_BACKGROUND_COLOR.g, FRIENDS_BNET_BACKGROUND_COLOR.b, FRIENDS_BNET_BACKGROUND_COLOR.a); if ( isAFK ) then button.status:SetTexture(FRIENDS_TEXTURE_AFK); elseif ( isDND ) then button.status:SetTexture(FRIENDS_TEXTURE_DND); else button.status:SetTexture(FRIENDS_TEXTURE_ONLINE); end if ( client == BNET_CLIENT_WOW ) then if ( not zoneName or zoneName == "" ) then infoText = UNKNOWN; else infoText = zoneName; end button.gameIcon:SetTexture("Interface\\FriendsFrame\\Battlenet-WoWicon"); elseif ( client == BNET_CLIENT_SC2 ) then button.gameIcon:SetTexture("Interface\\FriendsFrame\\Battlenet-Sc2icon"); infoText = gameText; end nameColor = FRIENDS_BNET_NAME_COLOR; button.gameIcon:Show(); else button.background:SetTexture(FRIENDS_OFFLINE_BACKGROUND_COLOR.r, FRIENDS_OFFLINE_BACKGROUND_COLOR.g, FRIENDS_OFFLINE_BACKGROUND_COLOR.b, FRIENDS_OFFLINE_BACKGROUND_COLOR.a); button.status:SetTexture(FRIENDS_TEXTURE_OFFLINE); nameColor = FRIENDS_GRAY_COLOR; button.gameIcon:Hide(); if ( lastOnline == 0 ) then infoText = FRIENDS_LIST_OFFLINE; else infoText = string.format(BNET_LAST_ONLINE_TIME, FriendsFrame_GetLastOnline(lastOnline)); end end if ( givenName and surname ) then if ( toonName ) then if ( client == BNET_CLIENT_WOW and CanCooperateWithToon(toonID) ) then nameText = string.format(BATTLENET_NAME_FORMAT, givenName, surname).." "..FRIENDS_WOW_NAME_COLOR_CODE.."("..toonName..")"; else if ( ENABLE_COLORBLIND_MODE == "1" ) then toonName = toonName..CANNOT_COOPERATE_LABEL; end nameText = string.format(BATTLENET_NAME_FORMAT, givenName, surname).." "..FRIENDS_OTHER_NAME_COLOR_CODE.."("..toonName..")"; end else nameText = string.format(BATTLENET_NAME_FORMAT, givenName, surname); end else nameText = UNKNOWN; end FriendsFrame_SummonButton_Update(button.summonButton); else -- header button:Hide(); FriendsFrameOfflineHeader:Show(); FriendsFrameOfflineHeader:SetAllPoints(button); return FRIENDS_BUTTON_HEADER_HEIGHT; end if ( FriendsFrame.selectedFriendType == FriendButtons[index].buttonType and FriendsFrame.selectedFriend == FriendButtons[index].id ) then button:LockHighlight(); end button.name:SetText(nameText); button.name:SetTextColor(nameColor.r, nameColor.g, nameColor.b); button.info:SetText(infoText); -- don't display a broadcast if the BNetBroadcasts data is out of sync if ( broadcastText and broadcastText ~= "" and BNetBroadcasts[FriendButtons[index].id] ) then height = FRIENDS_BUTTON_LARGE_HEIGHT; button.broadcastMessage:SetText(broadcastText); button.broadcastMessage:Show(); button.broadcastIcon:Show(); else height = FRIENDS_BUTTON_NORMAL_HEIGHT; button.broadcastMessage:Hide(); button.broadcastIcon:Hide(); end -- update the tooltip if hovering over a button if ( FriendsTooltip.button == button ) then FriendsFrameTooltip_Show(button); end button:Show(); return height; end function FriendsFrameStatusDropDown_OnLoad(self) UIDropDownMenu_Initialize(self, FriendsFrameStatusDropDown_Initialize); UIDropDownMenu_SetWidth(FriendsFrameStatusDropDown, 28); FriendsFrameStatusDropDownText:Hide(); FriendsFrameStatusDropDownButton:SetScript("OnEnter", FriendsFrameStatusDropDown_ShowTooltip); FriendsFrameStatusDropDownButton:SetScript("OnLeave", function() GameTooltip:Hide(); end); end function FriendsFrameStatusDropDown_ShowTooltip() local statusText; local status = FriendsFrameStatusDropDown.status; if ( status == 2 ) then statusText = FRIENDS_LIST_AWAY; elseif ( status == 3 ) then statusText = FRIENDS_LIST_BUSY; else statusText = FRIENDS_LIST_AVAILABLE; end GameTooltip:SetOwner(FriendsFrameStatusDropDown, "ANCHOR_RIGHT", -18, 0); GameTooltip:SetText(format(FRIENDS_LIST_STATUS_TOOLTIP, statusText)); GameTooltip:Show(); end function FriendsFrameStatusDropDown_OnShow(self) UIDropDownMenu_Initialize(self, FriendsFrameStatusDropDown_Initialize); FriendsFrameStatusDropDown_Update(self); end function FriendsFrameStatusDropDown_Initialize() local info = UIDropDownMenu_CreateInfo(); local optionText = "\124T%s.tga:16:16:0:0\124t %s"; info.padding = 8; info.checked = nil; info.notCheckable = 1; info.func = FriendsFrame_SetOnlineStatus; info.text = string.format(optionText, FRIENDS_TEXTURE_ONLINE, FRIENDS_LIST_AVAILABLE); UIDropDownMenu_AddButton(info); info.text = string.format(optionText, FRIENDS_TEXTURE_AFK, FRIENDS_LIST_AWAY); UIDropDownMenu_AddButton(info); info.text = string.format(optionText, FRIENDS_TEXTURE_DND, FRIENDS_LIST_BUSY); UIDropDownMenu_AddButton(info); end function FriendsFrameStatusDropDown_Update(self) local status; self = self or FriendsFrameStatusDropDown; if ( UnitIsAFK("player") ) then FriendsFrameStatusDropDownStatus:SetTexture(FRIENDS_TEXTURE_AFK); status = 2; elseif ( UnitIsDND("player") ) then FriendsFrameStatusDropDownStatus:SetTexture(FRIENDS_TEXTURE_DND); status = 3; else FriendsFrameStatusDropDownStatus:SetTexture(FRIENDS_TEXTURE_ONLINE); status = 1; end FriendsFrameStatusDropDown.status = status; end function FriendsFrame_SetOnlineStatus(button, status) status = status or button:GetID(); if ( status == FriendsFrameStatusDropDown.status ) then return; end if ( status == 1 ) then if ( UnitIsAFK("player") ) then SendChatMessage("", "AFK"); elseif ( UnitIsDND("player") ) then SendChatMessage("", "DND"); end elseif ( status == 2 ) then SendChatMessage("", "AFK"); else SendChatMessage("", "DND"); end end function FriendsFrameBroadcastInput_OnEnterPressed(self) local broadcastText = self:GetText() BNSetCustomMessage(broadcastText); FriendsFrameBroadcastInput_UpdateDisplay(self, broadcastText); end function FriendsFrameBroadcastInput_OnEscapePressed(self) FriendsFrameBroadcastInput_UpdateDisplay(self); end function FriendsFrameBroadcastInput_OnClearPressed(self) BNSetCustomMessage(""); FriendsFrameBroadcastInput_UpdateDisplay(nil, ""); end function FriendsFrameBroadcastInput_UpdateDisplay(self, broadcastText) local _; self = self or FriendsFrameBroadcastInput; if ( not broadcastText ) then _, _, broadcastText = BNGetInfo(); broadcastText = broadcastText or ""; end self:ClearFocus(); self:SetText(broadcastText); if ( broadcastText ~= "" ) then self.icon:SetAlpha(1); self:SetCursorPosition(0); self.clear:Show(); self:SetTextInsets(0, 18, 0, 0); else self.icon:SetAlpha(0.35); self.clear:Hide(); self:SetTextInsets(0, 10, 0, 0); end end function FriendsFrameTooltip_Show(self) if ( self.buttonType == FRIENDS_BUTTON_TYPE_HEADER ) then return; end local anchor, text; local FRIENDS_TOOLTIP_WOW_INFO_TEMPLATE = NORMAL_FONT_COLOR_CODE..FRIENDS_LIST_ZONE.."|r%1$s|n"..NORMAL_FONT_COLOR_CODE..FRIENDS_LIST_REALM.."|r%2$s"; local numToons = 0; local tooltip = FriendsTooltip; tooltip.height = 0; tooltip.maxWidth = 0; if ( self.buttonType == FRIENDS_BUTTON_TYPE_BNET ) then local nameText; local presenceID, givenName, surname, toonName, toonID, client, isOnline, lastOnline, isAFK, isDND, broadcastText, noteText, isFriend, broadcastTime = BNGetFriendInfo(self.id); -- account name if ( givenName and surname ) then nameText = format(BATTLENET_NAME_FORMAT, givenName, surname); else nameText = UNKNOWN; end anchor = FriendsFrameTooltip_SetLine(FriendsTooltipHeader, nil, nameText); -- toon 1 if ( toonID ) then local hasFocus, toonName, client, realmName, faction, race, class, guild, zoneName, level, gameText = BNGetToonInfo(toonID); level = level or ""; race = race or ""; class = class or ""; if ( client == BNET_CLIENT_WOW ) then if ( CanCooperateWithToon(toonID) ) then text = string.format(FRIENDS_TOOLTIP_WOW_TOON_TEMPLATE, toonName, level, race, class); else text = string.format(FRIENDS_TOOLTIP_WOW_TOON_TEMPLATE, toonName..CANNOT_COOPERATE_LABEL, level, race, class); end FriendsFrameTooltip_SetLine(FriendsTooltipToon1Name, nil, text); anchor = FriendsFrameTooltip_SetLine(FriendsTooltipToon1Info, nil, string.format(FRIENDS_TOOLTIP_WOW_INFO_TEMPLATE, zoneName, realmName), -4); elseif ( client == BNET_CLIENT_SC2 ) then FriendsFrameTooltip_SetLine(FriendsTooltipToon1Name, nil, toonName); anchor = FriendsFrameTooltip_SetLine(FriendsTooltipToon1Info, nil, gameText, -4); end else FriendsTooltipToon1Info:Hide(); FriendsTooltipToon1Name:Hide(); end -- note if ( noteText and noteText ~= "" ) then FriendsTooltipNoteIcon:Show(); anchor = FriendsFrameTooltip_SetLine(FriendsTooltipNoteText, anchor, noteText, -8); else FriendsTooltipNoteIcon:Hide(); FriendsTooltipNoteText:Hide(); end -- broadcast if ( broadcastText and broadcastText ~= "" ) then FriendsTooltipBroadcastIcon:Show(); broadcastText = broadcastText.."|n"..FRIENDS_BROADCAST_TIME_COLOR_CODE..string.format(BNET_BROADCAST_SENT_TIME, FriendsFrame_GetLastOnline(broadcastTime)); anchor = FriendsFrameTooltip_SetLine(FriendsTooltipBroadcastText, anchor, broadcastText, -8); else FriendsTooltipBroadcastIcon:Hide(); FriendsTooltipBroadcastText:Hide(); end if ( isOnline ) then FriendsTooltipHeader:SetTextColor(FRIENDS_BNET_NAME_COLOR.r, FRIENDS_BNET_NAME_COLOR.g, FRIENDS_BNET_NAME_COLOR.b); FriendsTooltipLastOnline:Hide(); numToons = BNGetNumFriendToons(self.id); else FriendsTooltipHeader:SetTextColor(FRIENDS_GRAY_COLOR.r, FRIENDS_GRAY_COLOR.g, FRIENDS_GRAY_COLOR.b); if ( lastOnline == 0 ) then text = FRIENDS_LIST_OFFLINE; else text = string.format(BNET_LAST_ONLINE_TIME, FriendsFrame_GetLastOnline(lastOnline)); end anchor = FriendsFrameTooltip_SetLine(FriendsTooltipLastOnline, anchor, text, -4); end elseif ( self.buttonType == FRIENDS_BUTTON_TYPE_WOW ) then local name, level, class, area, connected, status, noteText = GetFriendInfo(self.id); anchor = FriendsFrameTooltip_SetLine(FriendsTooltipHeader, nil, name); if ( connected ) then FriendsTooltipHeader:SetTextColor(FRIENDS_WOW_NAME_COLOR.r, FRIENDS_WOW_NAME_COLOR.g, FRIENDS_WOW_NAME_COLOR.b); FriendsFrameTooltip_SetLine(FriendsTooltipToon1Name, nil, string.format(FRIENDS_LEVEL_TEMPLATE, level, class)); anchor = FriendsFrameTooltip_SetLine(FriendsTooltipToon1Info, nil, area); else FriendsTooltipHeader:SetTextColor(FRIENDS_GRAY_COLOR.r, FRIENDS_GRAY_COLOR.g, FRIENDS_GRAY_COLOR.b); FriendsTooltipToon1Name:Hide(); FriendsTooltipToon1Info:Hide(); end if ( noteText ) then FriendsTooltipNoteIcon:Show(); anchor = FriendsFrameTooltip_SetLine(FriendsTooltipNoteText, anchor, noteText, -8); else FriendsTooltipNoteIcon:Hide(); FriendsTooltipNoteText:Hide(); end FriendsTooltipBroadcastIcon:Hide(); FriendsTooltipBroadcastText:Hide(); FriendsTooltipLastOnline:Hide(); end -- other toons local toonIndex = 1; local toonNameString; local toonInfoString; if ( numToons > 1 ) then FriendsFrameTooltip_SetLine(FriendsTooltipOtherToons, anchor, nil, -8); for i = 1, numToons do local hasFocus, toonName, client, realmName, faction, race, class, guild, zoneName, level, gameText = BNGetFriendToonInfo(self.id, i); -- the focused toon is already at the top of the tooltip if ( not hasFocus ) then toonIndex = toonIndex + 1; if ( toonIndex > FRIENDS_TOOLTIP_MAX_TOONS ) then break; end toonNameString = _G["FriendsTooltipToon"..toonIndex.."Name"]; toonInfoString = _G["FriendsTooltipToon"..toonIndex.."Info"]; if ( client == BNET_CLIENT_WOW ) then if ( realmName == playerRealmName and PLAYER_FACTION_GROUP[faction] == playerFactionGroup ) then text = string.format(FRIENDS_TOOLTIP_WOW_TOON_TEMPLATE, toonName, level, race, class); else text = string.format(FRIENDS_TOOLTIP_WOW_TOON_TEMPLATE, toonName..CANNOT_COOPERATE_LABEL, level, race, class); end gameText = zoneName; elseif ( client == BNET_CLIENT_SC2 ) then text = toonName; end FriendsFrameTooltip_SetLine(toonNameString, nil, text); FriendsFrameTooltip_SetLine(toonInfoString, nil, gameText); end end else FriendsTooltipOtherToons:Hide(); end for i = toonIndex + 1, FRIENDS_TOOLTIP_MAX_TOONS do toonNameString = _G["FriendsTooltipToon"..i.."Name"]; toonInfoString = _G["FriendsTooltipToon"..i.."Info"]; toonNameString:Hide(); toonInfoString:Hide(); end if ( numToons > FRIENDS_TOOLTIP_MAX_TOONS ) then FriendsFrameTooltip_SetLine(FriendsTooltipToonMany, nil, string.format(FRIENDS_TOOLTIP_TOO_MANY_CHARACTERS, numToons - FRIENDS_TOOLTIP_MAX_TOONS), 0); else FriendsTooltipToonMany:Hide(); end tooltip.button = self; tooltip:SetPoint("TOPLEFT", self, "TOPRIGHT", 36, 0); tooltip:SetHeight(tooltip.height + FRIENDS_TOOLTIP_MARGIN_WIDTH); tooltip:SetWidth(min(FRIENDS_TOOLTIP_MAX_WIDTH, tooltip.maxWidth + FRIENDS_TOOLTIP_MARGIN_WIDTH)); tooltip:Show(); end function FriendsFrameTooltip_SetLine(line, anchor, text, yOffset) local tooltip = FriendsTooltip; local top = 0; local left = FRIENDS_TOOLTIP_MAX_WIDTH - FRIENDS_TOOLTIP_MARGIN_WIDTH - line:GetWidth(); if ( text ) then line:SetText(text); end if ( anchor ) then top = yOffset or 0; line:SetPoint("TOP", anchor, "BOTTOM", 0, top); else local point, _, _, _, y = line:GetPoint(1); if ( point == "TOP" or point == "TOPLEFT" ) then top = y; end end line:Show(); tooltip.height = tooltip.height + line:GetHeight() - top; tooltip.maxWidth = max(tooltip.maxWidth, line:GetStringWidth() + left); return line; end function AddFriendFrame_OnShow() local factionGroup = UnitFactionGroup("player"); if ( factionGroup ) then local textureFile = "Interface\\FriendsFrame\\PlusManz-"..factionGroup; AddFriendInfoFrameFactionIcon:SetTexture(textureFile); AddFriendInfoFrameFactionIcon:Show(); AddFriendEntryFrameRightIcon:SetTexture(textureFile); AddFriendEntryFrameRightIcon:Show(); end end function AddFriendFrame_ShowInfo() AddFriendFrame:SetWidth(AddFriendInfoFrame:GetWidth()); AddFriendFrame:SetHeight(AddFriendInfoFrame:GetHeight()); AddFriendInfoFrame:Show(); AddFriendEntryFrame:Hide(); PlaySound("igMainMenuOpen"); end function AddFriendFrame_ShowEntry() AddFriendFrame:SetWidth(AddFriendEntryFrame:GetWidth()); AddFriendFrame:SetHeight(AddFriendEntryFrame:GetHeight()); AddFriendInfoFrame:Hide(); AddFriendEntryFrame:Show(); if ( BNFeaturesEnabledAndConnected() ) then AddFriendFrame.BNconnected = true; AddFriendEntryFrameLeftTitle:SetAlpha(1); AddFriendEntryFrameLeftDescription:SetText(BATTLENET_FRIEND_LABEL); AddFriendEntryFrameLeftDescription:SetTextColor(1, 1, 1); AddFriendEntryFrameLeftIcon:SetVertexColor(1, 1, 1); AddFriendEntryFrameLeftFriend:SetVertexColor(1, 1, 1); else AddFriendFrame.BNconnected = nil; AddFriendEntryFrameLeftTitle:SetAlpha(0.35); AddFriendEntryFrameLeftDescription:SetText(BATTLENET_UNAVAILABLE); AddFriendEntryFrameLeftDescription:SetTextColor(1, 0, 0); AddFriendEntryFrameLeftIcon:SetVertexColor(.4, .4, .4); AddFriendEntryFrameLeftFriend:SetVertexColor(.4, .4, .4); end if ( AddFriendFrame.editFocus ) then AddFriendFrame.editFocus:SetFocus(); end PlaySound("igMainMenuOpen"); end function AddFriendNameEditBox_OnTextChanged(self, userInput) if ( not AutoCompleteEditBox_OnTextChanged(self, userInput) ) then local text = self:GetText(); if ( text ~= "" ) then AddFriendNameEditBoxFill:Hide(); if ( AddFriendFrame.BNconnected ) then if ( string.find(text, "@") ) then AddFriendEntryFrame_Expand(); else AddFriendEntryFrame_Collapse(); end end else AddFriendEntryFrame_Collapse(); AddFriendNameEditBoxFill:Show(); end end end function AddFriendEntryFrame_Expand() AddFriendEntryFrame:SetHeight(296); AddFriendFrame:SetHeight(296); AddFriendNoteFrame:Show(); AddFriendEntryFrameAcceptButton:SetText(SEND_REQUEST); AddFriendEntryFrameRightTitle:SetAlpha(0.35); AddFriendEntryFrameRightDescription:SetAlpha(0.35); AddFriendEntryFrameRightIcon:SetVertexColor(.4, .4, .4); AddFriendEntryFrameRightFriend:SetVertexColor(.4, .4, .4); AddFriendEntryFrameLeftIcon:SetAlpha(1); AddFriendEntryFrameOrLabel:SetVertexColor(.3, .3, .3); end function AddFriendEntryFrame_Collapse(clearText) AddFriendEntryFrame:SetHeight(218); AddFriendFrame:SetHeight(218); AddFriendNoteFrame:Hide(); AddFriendEntryFrameAcceptButton:SetText(ADD_FRIEND); AddFriendEntryFrameRightTitle:SetAlpha(1); AddFriendEntryFrameRightDescription:SetAlpha(1); AddFriendEntryFrameRightIcon:SetVertexColor(1, 1, 1); AddFriendEntryFrameRightFriend:SetVertexColor(1, 1, 1); AddFriendEntryFrameLeftIcon:SetAlpha(0.5); if ( AddFriendFrame.BNconnected ) then AddFriendEntryFrameOrLabel:SetVertexColor(1, 1, 1); else AddFriendEntryFrameOrLabel:SetVertexColor(0.3, 0.3, 0.3); end if ( clearText ) then AddFriendNameEditBox:SetText(""); AddFriendNoteEditBox:SetText(""); end end function AddFriendFrame_Accept() local name = AddFriendNameEditBox:GetText(); if ( AddFriendFrame.BNconnected and string.find(name, "@") ) then BNSendFriendInvite(name, AddFriendNoteEditBox:GetText()); else AddFriend(name); end StaticPopupSpecial_Hide(AddFriendFrame); end function FriendsFriendsFrameDropDown_Initialize() local info = UIDropDownMenu_CreateInfo(); local value = FriendsFriendsFrame.view; info.value = FRIENDS_FRIENDS_ALL; info.text = FRIENDS_FRIENDS_CHOICE_EVERYONE; info.func = FriendsFriendsFrameDropDown_OnClick; info.arg1 = FRIENDS_FRIENDS_ALL; if ( value == info.value ) then info.checked = 1; UIDropDownMenu_SetText(FriendsFriendsFrameDropDown, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); info.value = FRIENDS_FRIENDS_POTENTIAL; info.text = FRIENDS_FRIENDS_CHOICE_POTENTIAL; info.func = FriendsFriendsFrameDropDown_OnClick; info.arg1 = FRIENDS_FRIENDS_POTENTIAL; if ( value == info.value ) then info.checked = 1; UIDropDownMenu_SetText(FriendsFriendsFrameDropDown, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); info.value = FRIENDS_FRIENDS_MUTUAL; info.text = FRIENDS_FRIENDS_CHOICE_MUTUAL; info.func = FriendsFriendsFrameDropDown_OnClick; info.arg1 = FRIENDS_FRIENDS_MUTUAL; if ( value == info.value ) then info.checked = 1; UIDropDownMenu_SetText(FriendsFriendsFrameDropDown, info.text); else info.checked = nil; end UIDropDownMenu_AddButton(info); end function FriendsFriendsFrameDropDown_OnClick(self, value) FriendsFriendsFrame.view = value; UIDropDownMenu_SetSelectedValue(FriendsFriendsFrameDropDown, value); FriendsFriendsScrollFrameScrollBar:SetValue(0); FriendsFriendsList_Update(); end function FriendsFriendsList_Update() if ( FriendsFriendsWaitFrame:IsShown() ) then return; end local friendsButton, friendsIndex; local showMutual, showPotential; local view = FriendsFriendsFrame.view; local selection = FriendsFriendsFrame.selection; local requested = FriendsFriendsFrame.requested; local presenceID = FriendsFriendsFrame.presenceID; local numFriendsFriends = 0; local numMutual, numPotential = BNGetNumFOF(presenceID); local offset = FauxScrollFrame_GetOffset(FriendsFriendsScrollFrame); local haveSelection; if ( view == FRIENDS_FRIENDS_POTENTIAL or view == FRIENDS_FRIENDS_ALL ) then showPotential = true; numFriendsFriends = numFriendsFriends + numPotential; end if ( view == FRIENDS_FRIENDS_MUTUAL or view == FRIENDS_FRIENDS_ALL ) then showMutual = true; numFriendsFriends = numFriendsFriends + numMutual; end for i = 1, FRIENDS_FRIENDS_TO_DISPLAY, 1 do friendsIndex = i + offset; friendsButton = _G["FriendsFriendsButton"..i]; if ( friendsIndex > numFriendsFriends ) then friendsButton:Hide(); else local friendID, givenName, surname, isMutual = BNGetFOFInfo(presenceID, showMutual, showPotential, friendsIndex); local name = string.format(BATTLENET_NAME_FORMAT, givenName, surname); if ( isMutual ) then friendsButton:Disable(); if ( view ~= FRIENDS_FRIENDS_MUTUAL ) then friendsButton.name:SetText(name.." "..HIGHLIGHT_FONT_COLOR_CODE..FRIENDS_FRIENDS_MUTUAL_TEXT); else friendsButton.name:SetText(name); end friendsButton.name:SetTextColor(GRAY_FONT_COLOR .r, GRAY_FONT_COLOR .g, GRAY_FONT_COLOR .b); elseif ( requested[friendID] ) then friendsButton.name:SetText(name.." "..HIGHLIGHT_FONT_COLOR_CODE..FRIENDS_FRIENDS_REQUESTED_TEXT); friendsButton:Disable(); friendsButton.name:SetTextColor(GRAY_FONT_COLOR .r, GRAY_FONT_COLOR .g, GRAY_FONT_COLOR .b); else friendsButton.name:SetText(name); friendsButton:Enable(); friendsButton.name:SetTextColor(NORMAL_FONT_COLOR.r, NORMAL_FONT_COLOR.g, NORMAL_FONT_COLOR.b); if ( selection == friendID ) then haveSelection = true; friendsButton:LockHighlight(); else friendsButton:UnlockHighlight(); end end friendsButton.friendID = friendID; friendsButton:Show(); end end if ( haveSelection ) then FriendsFriendsSendRequestButton:Enable(); else FriendsFriendsSendRequestButton:Disable(); end FauxScrollFrame_Update(FriendsFriendsScrollFrame, numFriendsFriends, FRIENDS_FRIENDS_TO_DISPLAY, FRIENDS_FRAME_FRIENDS_FRIENDS_HEIGHT); end function FriendsFriendsButton_OnClick(self) PlaySound("igMainMenuOptionCheckBoxOn"); FriendsFriendsFrame.selection = self.friendID; FriendsFriendsList_Update(); end function FriendsFrameIgnoreButton_OnClick(self) FriendsFrame_SelectSquelched(self.type, self.index); IgnoreList_Update(); end function FriendsFriendsFrame_SendRequest() PlaySound("igCharacterInfoTab"); FriendsFriendsFrame.requested[FriendsFriendsFrame.selection] = true; BNSendFriendInviteByID(FriendsFriendsFrame.selection, FriendsFriendsNoteEditBox:GetText()); FriendsFriendsFrame_Reset(); FriendsFriendsList_Update(); end function FriendsFriendsFrame_Close() StaticPopupSpecial_Hide(FriendsFriendsFrame); end function FriendsFriendsFrame_OnEvent(self, event) if ( event == "BN_REQUEST_FOF_SUCCEEDED" ) then if ( self:IsShown() ) then FriendsFriendsFrame.view = FRIENDS_FRIENDS_ALL; UIDropDownMenu_EnableDropDown(FriendsFriendsFrameDropDown); UIDropDownMenu_Initialize(FriendsFriendsFrameDropDown, FriendsFriendsFrameDropDown_Initialize); UIDropDownMenu_SetSelectedValue(FriendsFriendsFrameDropDown, FRIENDS_FRIENDS_ALL); local waitFrame = FriendsFriendsWaitFrame; -- need to stop the flashing because it's flashing with showWhenDone set to true if ( UIFrameIsFlashing(waitFrame) ) then UIFrameFlashStop(waitFrame); end waitFrame:Hide(); FriendsFriendsList_Update(); end elseif ( event == "BN_REQUEST_FOF_FAILED" ) then -- FIX ME - need an error here elseif ( event == "BN_DISCONNECTED" ) then FriendsFriendsFrame_Close(); end end function FriendsFriendsFrame_Reset() FriendsFriendsSendRequestButton:Disable(); FriendsFriendsNoteEditBox:SetText(""); FriendsFriendsNoteEditBox:ClearFocus(); FriendsFriendsFrame.selection = nil; end function FriendsFriendsFrame_Show(presenceID) local presenceID, givenName, surname = BNGetFriendInfoByID(presenceID); FriendsFriendsFrameTitle:SetFormattedText(FRIENDS_FRIENDS_HEADER, FRIENDS_BNET_NAME_COLOR_CODE..string.format(BATTLENET_NAME_FORMAT, givenName, surname)); FriendsFriendsFrame.presenceID = presenceID; UIDropDownMenu_DisableDropDown(FriendsFriendsFrameDropDown); FriendsFriendsFrame_Reset(); FriendsFriendsWaitFrame:Show(); for i = 1, FRIENDS_FRIENDS_TO_DISPLAY, 1 do _G["FriendsFriendsButton"..i]:Hide(); end FauxScrollFrame_Update(FriendsFriendsScrollFrame, 0, FRIENDS_FRIENDS_TO_DISPLAY, FRIENDS_FRAME_FRIENDS_FRIENDS_HEIGHT); StaticPopupSpecial_Show(FriendsFriendsFrame); BNRequestFOFInfo(presenceID); end function CanCooperateWithToon(toonID) local hasFocus, toonName, client, realmName, faction = BNGetToonInfo(toonID); if ( realmName == playerRealmName and PLAYER_FACTION_GROUP[faction] == playerFactionGroup ) then return true; else return false; end end